赋值运算符的返回类型

Return type of assignment operator

提问人:anatolyg 提问时间:9/30/2013 最后编辑:Communityanatolyg 更新时间:6/6/2021 访问量:725

问:

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

class X {...};

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

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

奇怪的是,无论参数如何,每个人都建议返回对 X 的非常量引用。这明确允许像 (a = b).clear() 这样的表达式,这应该是好的。

我有不同的意见,我想在我的代码中不允许像 、 这样的表达式。我的想法是,这些表达式在一行代码上执行了过于复杂的事情。所以我决定让我的赋值运算符返回:(x=y).clear(x=y)=zx=y=zvoid

void X::operator=(X) {...}
void X::operator=(int) {...}

这会产生哪些负面影响?(除了看起来与平时不同)

我的 X 类可以与标准容器一起使用吗(例如)?std::vector<X>

我正在使用 C++03(如果这很重要)。

C++ 赋值运算符

评论

0赞 billz 9/30/2013
同意,我从一开始就错过了。
1赞 Matthieu M. 9/30/2013
C++ 中有一个总体建议:重载运算符的行为应该与整数类似。在整数 () 上可以进行链接,因此在重载时应该保留这种语法可能性。a = b = c = 3
0赞 Angew is no longer proud of SO 9/30/2013
@MatthieuM。+1.当然,与往常一样,好的规则有更好的例外:我想到了直播。<<
2赞 Matthieu M. 9/30/2013
@Angew:实际上,这可能很奇怪,因为我从来没有真正做过C,因此对我来说,主要是一个流媒体运营商,碰巧一些奇怪的家伙决定用它来进行位移:)<<
3赞 Neil Kirk 9/30/2013
你不应该不必要地限制用户的编码风格,无论你认为它可能有多糟糕。考虑他们制作了一个模板函数,并尝试使用您的类。如果您的操作员不再以预期的方式工作,它可能不再编译。

答:

27赞 ComicSansMS 9/30/2013 #1

您的类不符合 CopyAssignable 概念 (§17.6.3.1),因此标准不再保证它能与需要此概念的标准容器一起使用(例如 需要此操作)。std::vectorinsert

除此之外,这种行为不是惯用的,使用你的代码的程序员会认为是令人惊讶的。如果要禁止链接,请考虑添加一个执行赋值的命名函数。

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