返回类型的赋值运算符

ana*_*lyg 16 c++ assignment-operator

定义赋值运算符时,它总是如下所示:

class X {...};

X& X::operator=(...whatever...);
Run Code Online (Sandbox Code Playgroud)

也就是说,它具有返回类型"对X的引用".这里,参数(...whatever...)可以是X&,const X&X在使用复制和交换习语时,或任何其他类型.

似乎很奇怪,无论参数如何,每个人都建议返回非const引用X.这显然允许表达式(a = b).clear(),这应该是好的.

我有不同的意见,我希望禁止般的表情(x=y).clear,(x=y)=z甚至x=y=z在我的代码.我的想法是,这些表达式在一行代码上做的事情太复杂了.所以我决定让我的赋值运算符返回void:

void X::operator=(X) {...}
void X::operator=(int) {...}
Run Code Online (Sandbox Code Playgroud)

这有哪些负面影响?(除了看起来与平常不同)

我的班级X可以用于标准容器(例如std::vector<X>)吗?

我正在使用C++ 03(如果重要的话).

Com*_*sMS 24

您的类不符合CopyAssignable概念(第17.6.3.1节),因此标准不再保证使用需要此标准的容器(例如,std::vector需要此insert操作).

除此之外,这种行为不是惯用的,程序员使用您的代码会感到惊讶.如果要禁止链接,请考虑添加一个执行赋值的命名函数.

只是不要尝试以这种微妙的方式改变惯用运算符的行为.它会使您的代码更难以阅读和维护.