2013-09-30 3 views
16

При определении оператора присваивания, он неизменно выглядит следующим образом:Возврат типа оператора присваивания

class X {...}; 

X& X::operator=(...whatever...); 

То есть, он имеет тип возвращаемого значения «ссылка на X». Здесь параметры (...whatever...) могут быть X&, const X&, только X при использовании copy-and-swap idiom или любого другого типа.

Кажется странным, что everyone recommends returning a non-const reference to X, независимо от параметров. Это явно допускает выражения типа (a = b).clear(), который должен быть хорошим.

У меня другое мнение, и я хочу запретить выражения, подобные , (x=y)=z и даже x=y=z в моем коде. Моя идея состоит в том, что эти выражения слишком сложны в одной строке кода. Поэтому я решил, чтобы мои операторы присваивания возвращают void:

void X::operator=(X) {...} 
void X::operator=(int) {...} 

Какие негативные последствия это имеет? (за исключением вида, отличного от обычного)

Может ли мой класс X использоваться со стандартными контейнерами (например, std::vector<X>)?

Я использую C++ 03 (если это имеет значение).

+0

согласился, я пропустил с самого начала. – billz

+1

В C++ существует всеобъемлющая рекомендация: * перегруженные операторы должны вести себя так же, как и для целых чисел *. Цепочка возможна для целых чисел ('a = b = c = 3'), и поэтому следует сохранять эту синтаксическую возможность при перегрузке. –

+0

@ MatthieuM. +1. Конечно, как всегда, хорошие правила имеют еще лучшие исключения: '' 'на потоках приходит на ум. – Angew

ответ

24

Ваш класс не соответствует CopyAssignable концепции (§17.6.3.1), так что больше не гарантируется стандартом для работы со стандартными контейнерами, которые требуют этого (например, std::vector этого требует для insert операций).

Кроме того, это поведение не является идиоматическим и будет восприниматься как удивительное для программистов, использующих ваш код. Если вы хотите запретить цепочку, попробуйте добавить именованную функцию, которая выполняет назначение.

Просто не пытайтесь изменить поведение идиоматических операторов тонким способом. Это сделает ваш код труднее читать и поддерживать.

Смежные вопросы