Мой вопрос довольно прост, но на самом деле я не могу найти информацию об этом. Требуется ли копирование (перемещение) оператора присваивания?Требования к оператору присваивания
ответ
copy constructor, будь то в синтаксисе T object(object_to_copy)
или T object = object_to_copy
построить новый объект, поэтому он не требует, чтобы он уже существовал. Это описано в стандарте C++, раздел 12.8/2.
Обычный оператор присваивания, который используется в другом контексте, кроме конструкции копирования выше, требует, чтобы целевой объект уже существовал (т. Е. Должен быть построен). Это можно легко сделать из раздела 13.5 стандарта.
@jrok нет, это не так, и я надеялся, что мой первый параграф был довольно ясным. Я добавлю «что» во втором предложении, чтобы устранить неоднозначность, которую вы заметили. – Christophe
Что я могу получить от вашего вопроса, вы хотите спросить, есть ли в a = b
, должно ли оно быть полностью построено? a
.
В этом случае ответ да, a
должен быть полностью сконструированным объектом до того, как на него вызывается оператор присваивания. Поскольку присваивание имеет смысл только между двумя объектами не между объектом и некоторыми случайными исходными битами.
В отличие от других ответов, я скажу, что 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=
вызывается перед тем, как конструктор закончил, и разрешено писать такую конструкцию.
класс полностью построен, когда был запущен список инициализаторов. То есть к моменту, когда поток программы попадает в открывание '' '' в конструкторе, объект строится. Код между фигурными скобками в конструкторе следует рассматривать как «постконструкция» –
Dang. Я удалю ответ, но могу ли я получить цитату из стандарта или указателя, где я могу найти цитату? Просто для себя. – luk32
Конструктор может вызывать любую функцию-член. Нам действительно не нужно ссылаться на стандарт, чтобы проверить это. –
В принципе, нет требований AFAIK, так что подпись функции должна соответствовать, поэтому компилятор подберет ее. Более интересно то, как вы хотите назначить неконструированный объект? Вызовите оператора в конструкторе? – luk32
Бит более подробной информации – Fiju
Вы имеете в виду, что если в 'a = b',' a' требуется, чтобы быть действительным объектом? Да, оба 'a' и' b' должны быть действительными объектами. – Shoe