声明为默认值的赋值操作是否可以具有引用限定符?

Can assignment operations which declared as default have reference qualifiers?

提问人:Myrddin Krustowski 提问时间:11/10/2022 更新时间:11/20/2022 访问量:57

问:

当将赋值操作声明为 时,使它们成为引用限定以防止赋值给临时操作有什么错误吗?(大多数情况下,它可以防止愚蠢的错误)。 通用资源,不要说任何关于“默认”操作的引用限定符,到目前为止我看到的几乎每个示例都没有使用适当的 ref-qualifier 声明它们。default

语言标准是否对将赋值操作声明为默认值的引用限定符有任何说明。

  1. 这是允许的吗?
  2. 这样做有什么问题吗?毕竟,除了极少数例外,赋值是没有意义的。
  3. 我知道默认情况下它们没有被设置为向后兼容性的引用条件,但是有理由不这样做吗?(如果第一个问题的答案是“是”,第二个问题的答案是“否”)。
C++ 赋值运算符 五法则

评论

2赞 Sam Varshavchik 11/10/2022
使用 C++ 编译器几分钟应该很容易告诉你它是否编译,它会告诉你它是否“允许”;有什么东西阻止你自己简单地确定这一点吗?至于这样做是否有任何“错误”,就像 C++ 中的其他所有内容一样,它可能是对的,也可能是错误的,这取决于每个案例的具体细节。没有某种C++权威可以发布关于单方面错误或不错误的法令。
0赞 Myrddin Krustowski 11/10/2022
编译器接受代码并不排除 UB。我没有理由相信它会是 UB,但谁知道这些天......
0赞 Some programmer dude 11/10/2022
函数限定符以及是否可以调用函数是关于编译器检查的语法和语义。
0赞 Myrddin Krustowski 11/10/2022
如果它是由所有编译器生成的,那么标准是否保证它是它应该有的样子?例如,即使在标准弃用的情况下,通常也会生成复制操作。
1赞 Sam Varshavchik 11/10/2022
单纯的声明本身不能成为UB。根据代码的作用,它可以是 UB,但 ref 限定运算符重载的 UB 和 .int x;

答:

1赞 Brian Bi 11/20/2022 #1

允许使用附加的 ref-qualifier 定义默认赋值运算符。请参阅 [dcl.fct.def.default]/2.1

你是否真的应该这样做是一个基于意见的问题。我不认为添加 有什么明显的错误,但我怀疑如果你试图说服团队中的每个人都这样做,你会遇到阻力,因为它可能确实会捕获一些错误,但很少,而且几乎所有这些错误都可能在单元测试中。(相比之下,像 这样的错误,其中左侧是左值,更常见,你不会发现这些错误,但编译器可能会发出警告。&if (x = 3)

这有点像你可能很难说服人们声明他们的变量,就好像他们知道指针不会改变一样。当然,它提高了一点安全性,但它也需要额外的打字。const char*const char* const