Может возникнуть соблазн сделать оператор присваивания копий возвращает void
, если вам не понадобятся прикованные присваивания (как показано в других ответах) в любом случае. В конце концов, прикомандированные задания часто трудно читать и понимать, поэтому их нельзя считать улучшением .
Однако часто упускается из виду, что void operator=(Poly& const)
означает, что ваш тип больше не будет соответствовать CopyAssignable
concept, для чего требуется тип возврата T&
.
типа, который не выполняет CopyAssignable
понятия не может быть официально использоваться для некоторых стандартных контейнеров операций, например std::vector::insert
, что означает, что следующий, казалось бы, невинный кусок кода доходности неопределенного поведения, несмотря на то, что, вероятно, работает прекрасно:
#include <vector>
struct Poly
{
void operator=(Poly const&) {} // Poly is not CopyAssignable
};
int main()
{
std::vector<Poly> v;
Poly p;
v.insert(v.begin(), p); // undefined behaviour
}
в стандартном с ++ объясняет в § 17.6.4.8/2.3, где говорится об ограничениях на программах с использованием стандартной библиотеки:
(...) эффекты являются неопределенные в следующих случаях:
(...) для типов, используемых в качестве аргументов шаблона при создании экземпляра компонента в шаблона, , если операции по типу не реализуют семантики применимых требований подпредложения (...).
Конечно, это именно потому, что на неопределенное поведение, что компилятор позволено игнорировать ошибку и сделать программу ведут себя хорошо, соответствуя явно предназначенное поведение. Но этого не требуется.
Вы также должны учитывать, что вы не можете предсказать все будущие использования вашего типа Poly
. Кто-то может написать какой-нибудь шаблон функции, такие как:
template <class T>
void f(T const& t)
{
T t2;
T t3 = t2 = t;
// ...
}
Эта функция будет потом не работать с Poly
класса.
Просто не нарушайте это соглашение C++, и вы не столкнетесь с проблемами.
Поскольку 'Я просто новичок в C++' часть была утрачена в (в противном случае хорошо означало) редактирование, а так как вариации 'p2 = & p1' всплывают в комментариях ...' '' 'и' 'в' Poly & Poly :: operator = 'объявление означает, что оператор возвращает ссылку - для себя в этом случае, что точно что 'return * this,' делает.С другой стороны, '&' in '& p1' оценивает адрес' p1', который является указателем 'Poly *' и не может быть назначен объекту 'Poly'. Не путайте два значения '&' в двух разных контекстах. – dxiv