【发布时间】:2020-04-13 06:48:54
【问题描述】:
我和我的 C++ 同事遇到了一个奇怪的结构:
struct A { int i; };
void foo(A const& a);
int main() {
foo(A() = A{2}); // Legal
}
A() = A{2} 表达式完全让我们感到困惑,因为它似乎将 A{2} 分配给了一个临时的、默认构造的对象。但请在编译器资源管理器 (https://gcc.godbolt.org/z/2LsfSk) 中查看。它似乎是一个法律声明(受 GCC 9 和 Clang 9 支持),如下声明:
struct A { int i; };
int main() {
A() = A{2};
auto a = A() = A{3};
}
因此,在某些情况下,A() 似乎是一个左值。还是这里发生了其他事情?希望得到一些解释,最好是对 C++17 标准的引用。
更新:@Brian 发现这是 assigning to rvalue: why does this compile? 的副本。但如果有人能在 C++ 标准中找到适当的参考,我将不胜感激。
【问题讨论】:
-
@Brian 是重复的吗?
int() = 2;也是对右值的赋值,但编译器不允许这样做。那么是什么让用户定义的类型与众不同呢? -
副本解释了这一点。如果 LHS 是一个类,那么赋值操作调用
operator=。如果 LHS 是非类,则使用内置运算符,它需要一个左值。 -
@Brian,很好,但副本没有指定相关的语言标准部分......这就是我要求的。
-
好的。我重新打开了这个问题。
标签: c++ language-lawyer c++17 rvalue copy-assignment