Требования к оператору присваивания

0

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

  • 0
    По сути, нет никаких требований AFAIK, просто подпись функции должна совпадать, поэтому компилятор ее подберет. Что более интересно, как вы хотите присвоить неструктурированному объекту? Вызов оператора в конструктор?
  • 0
    Немного подробнее, пожалуйста
Показать ещё 6 комментариев
Теги:

3 ответа

1
Лучший ответ

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

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

  • 0
    @ jrok нет, это не так, и я надеялся, что мой первый абзац был довольно ясен об этом. Я добавлю «который» во втором предложении, чтобы устранить неоднозначность, которую вы заметили.
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. Я удалю ответ, но могу ли я получить цитату из стандарта или указатель, где я могу найти цитату? Просто для себя.
Показать ещё 6 комментариев
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню