提问人:anatolyg 提问时间:9/30/2013 最后编辑:Communityanatolyg 更新时间:6/6/2021 访问量:725
赋值运算符的返回类型
Return type of assignment operator
问:
定义赋值运算符时,它总是如下所示:
class X {...};
X& X::operator=(...whatever...);
也就是说,它的返回类型为“对 X 的引用”。在这里,参数 () 可以是 、 const X&
、只是在使用复制和交换习惯用语时,或任何其他类型。...whatever...
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(如果这很重要)。
答:
27赞
ComicSansMS
9/30/2013
#1
您的类不符合 CopyAssignable 概念 (§17.6.3.1),因此标准不再保证它能与需要此概念的标准容器一起使用(例如 需要此操作)。std::vector
insert
除此之外,这种行为不是惯用的,使用你的代码的程序员会认为是令人惊讶的。如果要禁止链接,请考虑添加一个执行赋值的命名函数。
只是不要试图以这样微妙的方式改变惯用运算符的行为。这将使您的代码更难阅读和维护。
评论
a = b = c = 3
<<
<<