定义赋值运算符时,它总是如下所示:
class X {...};
X& X::operator=(...whatever...);
也就是说,它具有返回类型“对X的引用”。在这里,参数(...whatever...
)可以是X&
,const X&
,使用copy-and-swap idiom或任何其他类型时只需X
。
everyone recommends returning a non-const reference to X
似乎很奇怪,无论参数如何。这显然允许像(a = b).clear()
这样的表达式,这应该是好的。
我有不同意见,我想在我的代码中禁止使用(x=y).clear
,(x=y)=z
甚至x=y=z
等表达式。我的想法是,这些表达式在一行代码上做的事情太复杂了。所以我决定让我的赋值运算符返回void
:
void X::operator=(X) {...}
void X::operator=(int) {...}
这有哪些负面影响? (除了看起来与平时不同)
我的班级X可以与标准容器一起使用(例如std::vector<X>
)吗?
我正在使用C ++ 03(如果重要的话)。
答案 0 :(得分:24)
您的课程不符合CopyAssignable概念(第17.6.3.1节),因此标准不再保证使用需要此标准的标准容器(例如std::vector
要求{ {1}}操作)。
除此之外,这种行为不是惯用的,并且程序员使用您的代码会感到惊讶。如果您想禁止链接,请考虑添加一个命名函数来代替它。
不要试图以这种微妙的方式改变惯用运算符的行为。它会使您的代码更难以阅读和维护。