返回类型的赋值运算符

时间:2013-09-30 08:48:35

标签: c++ assignment-operator

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

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(如果重要的话)。

1 个答案:

答案 0 :(得分:24)

您的课程不符合CopyAssignable概念(第17.6.3.1节),因此标准不再保证使用需要此标准的标准容器(例如std::vector要求{ {1}}操作)。

除此之外,这种行为不是惯用的,并且程序员使用您的代码会感到惊讶。如果您想禁止链接,请考虑添加一个命名函数来代替它。

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