В C++ понятие возврата ссылки от оператора присваивания копии неясно мне. Почему оператор присваивания копии не может возвратить копию нового объекта? Кроме того, если у меня есть класс A
, и следующее:
A a1(param);
A a2 = a1;
A a3;
a3 = a2; //<--- this is the problematic line
operator=
определяется следующим образом:
A A::operator=(const A& a)
{
if (this == &a)
{
return *this;
}
param = a.param;
return *this;
}
Строго говоря, результат оператора присваивания копии не должен возвращать ссылку, хотя для имитации поведения по умолчанию, используемого компилятором C ++, он должен возвращать неконстантную ссылку на назначенный объект (неявно сгенерированный оператор присваивания копии вернет неконстантную ссылку - C ++ 03: 12.8 / 10). Я видел довольно много кода, который возвращает void
из перегрузок присваивания копий, и я не могу вспомнить, когда это вызвало серьезную проблему. Возврат void
предотвратит «цепочку назначений» ( a = b = c;
) и предотвратит, например, использование результата присваивания в тестовом выражении. Хотя такой код отнюдь не является чем-то неслыханным, я также не думаю, что он особенно распространен - особенно для непримитивных типов (если интерфейс класса не предназначен для таких тестов, например для iostreams).
Я не рекомендую вам это делать, просто указываю, что это разрешено и не вызывает особых проблем.
Эти другие вопросы SO связаны (вероятно, не совсем дурацкими), которые содержат информацию / мнения, которые могут вас заинтересовать.
Отчасти это связано с тем, что возврат ссылки на self быстрее, чем возврат по значению, но, кроме того, это сделано для того, чтобы сохранить оригинальную семантику, существующую в примитивных типах.
operator =
можно определить так, чтобы он возвращал все, что вы хотите. Вам нужно уточнить, в чем на самом деле проблема; Я подозреваю, что у вас есть конструктор копирования, использующий внутри себя operator =
, и это вызывает переполнение стека, поскольку конструктор копирования вызывает operator =
, который должен использовать конструктор копирования для возврата A
по значению до бесконечности.