Почему оператор присваивания копии должен возвратить ссылку ссылки/константы?

В 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;
}
62
задан Azeem 20 April 2018 в 09:59
поделиться

3 ответа

Строго говоря, результат оператора присваивания копии не должен возвращать ссылку, хотя для имитации поведения по умолчанию, используемого компилятором C ++, он должен возвращать неконстантную ссылку на назначенный объект (неявно сгенерированный оператор присваивания копии вернет неконстантную ссылку - C ++ 03: 12.8 / 10). Я видел довольно много кода, который возвращает void из перегрузок присваивания копий, и я не могу вспомнить, когда это вызвало серьезную проблему. Возврат void предотвратит «цепочку назначений» ( a = b = c; ) и предотвратит, например, использование результата присваивания в тестовом выражении. Хотя такой код отнюдь не является чем-то неслыханным, я также не думаю, что он особенно распространен - ​​особенно для непримитивных типов (если интерфейс класса не предназначен для таких тестов, например для iostreams).

Я не рекомендую вам это делать, просто указываю, что это разрешено и не вызывает особых проблем.

Эти другие вопросы SO связаны (вероятно, не совсем дурацкими), которые содержат информацию / мнения, которые могут вас заинтересовать.

66
ответ дан 24 November 2019 в 16:40
поделиться

Отчасти это связано с тем, что возврат ссылки на self быстрее, чем возврат по значению, но, кроме того, это сделано для того, чтобы сохранить оригинальную семантику, существующую в примитивных типах.

5
ответ дан 24 November 2019 в 16:40
поделиться

operator = можно определить так, чтобы он возвращал все, что вы хотите. Вам нужно уточнить, в чем на самом деле проблема; Я подозреваю, что у вас есть конструктор копирования, использующий внутри себя operator = , и это вызывает переполнение стека, поскольку конструктор копирования вызывает operator = , который должен использовать конструктор копирования для возврата A по значению до бесконечности.

4
ответ дан 24 November 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: