当定义一个赋值操作符时,通常看起来像这样:
class X {...};
X& X::operator=(...whatever...);
也就是说,它的返回类型是“X的引用”。在这里,参数(...whatever...
)可以是X&
,const X&
,使用拷贝-交换惯用法时仅为X
,或任何其他类型。
奇怪的是,所有人都推荐返回非const引用,而不管参数如何。这明确允许像(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(如果这很重要的话)。
a = b = c = 3
),因此在重载时应该保留这种语法可能性。 - Matthieu M.<<
这样的好规则也有更好的例外。 - Angew is no longer proud of SO<<
主要是一个流操作符,而某些奇怪的人决定将其用于位移 :) - Matthieu M.