18

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

class X {...};

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

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

不管参数如何,每个人都建议返回对 的非常量引用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(如果重要的话)。

4

1 回答 1

27

您的课程不符合CopyAssignable概念(第 17.6.3.1 节),因此标准不再保证可以与需要此操作的标准容器一起使用(例如,操作std::vector需要此insert操作)。

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

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

于 2013-09-30T08:54:12.003 回答