Мой вопрос довольно прост, но на самом деле я не могу найти никакой информации об этом. Требуется ли копирование (перемещение) оператора присваивания?
Конструктор копирования, будь то в T object(object_to_copy)
синтаксиса T object(object_to_copy)
или T object = object_to_copy
новый объект, поэтому он не требует, чтобы он уже существовал. Это описано в стандарте C++, раздел 12.8/2.
Обычный оператор присваивания, который используется в другом контексте, кроме конструкции копирования выше, требует, чтобы целевой объект уже существовал (т.е. Должен быть построен). Это можно легко сделать из раздела 13.5 стандарта.
Напротив других ответов я скажу, что operator=
можно вызвать до того, как объект будет построен. Я считаю, что следующий код действителен и не вызывает неопределенного поведения.
#include <iostream>
class A
{
public:
A(){
std::cout << "A()\n";
*this = *this;
}
A(const A& a) { std::cout << "A(const A& a)\n"; }
A& operator=(const A& a) { std::cout << "operator=\n"; return *this; }
};
int main()
{
A a;
return 0;
}
Вывод:
A()
operator=
Конечно, это не имеет никакого смысла. Однако вопрос в том, разрешено ли что-либо, мой ответ да, это так. Очевидно, operator=
вызывается до завершения конструктора, и одному разрешено писать такую конструкцию.
{
в конструкторе, объект создается. Код между фигурными скобками в конструкторе должен рассматриваться как «постстроительный»
Что я могу получить от вашего вопроса вы хотите спросить, есть ли в a = b
, должно быть полностью построен. a
В этом случае ответ да, a
должен быть полностью сконструированным объектом до того, как на него вызывается оператор присваивания. Поскольку присваивание имеет смысл только между двумя объектами не между объектом и некоторыми случайными исходными битами.