2014-11-30 5 views
0

Мой вопрос довольно прост, но на самом деле я не могу найти информацию об этом. Требуется ли копирование (перемещение) оператора присваивания?Требования к оператору присваивания

+0

В принципе, нет требований AFAIK, так что подпись функции должна соответствовать, поэтому компилятор подберет ее. Более интересно то, как вы хотите назначить неконструированный объект? Вызовите оператора в конструкторе? – luk32

+0

Бит более подробной информации – Fiju

+1

Вы имеете в виду, что если в 'a = b',' a' требуется, чтобы быть действительным объектом? Да, оба 'a' и' b' должны быть действительными объектами. – Shoe

ответ

1

copy constructor, будь то в синтаксисе T object(object_to_copy) или T object = object_to_copy построить новый объект, поэтому он не требует, чтобы он уже существовал. Это описано в стандарте C++, раздел 12.8/2.

Обычный оператор присваивания, который используется в другом контексте, кроме конструкции копирования выше, требует, чтобы целевой объект уже существовал (т. Е. Должен быть построен). Это можно легко сделать из раздела 13.5 стандарта.

+0

@jrok нет, это не так, и я надеялся, что мой первый параграф был довольно ясным. Я добавлю «что» во втором предложении, чтобы устранить неоднозначность, которую вы заметили. – Christophe

0

Что я могу получить от вашего вопроса, вы хотите спросить, есть ли в a = b, должно ли оно быть полностью построено? a.

В этом случае ответ да, a должен быть полностью сконструированным объектом до того, как на него вызывается оператор присваивания. Поскольку присваивание имеет смысл только между двумя объектами не между объектом и некоторыми случайными исходными битами.

0

В отличие от других ответов, я скажу, что 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= вызывается перед тем, как конструктор закончил, и разрешено писать такую ​​конструкцию.

+2

класс полностью построен, когда был запущен список инициализаторов. То есть к моменту, когда поток программы попадает в открывание '' '' в конструкторе, объект строится. Код между фигурными скобками в конструкторе следует рассматривать как «постконструкция» –

+0

Dang. Я удалю ответ, но могу ли я получить цитату из стандарта или указателя, где я могу найти цитату? Просто для себя. – luk32

+0

Конструктор может вызывать любую функцию-член. Нам действительно не нужно ссылаться на стандарт, чтобы проверить это. –