在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
我和我的 C++ 同事遇到了一个奇怪的结构:
struct A { int i; };
void foo(A const& a);
int main() {
foo(A() = A{2}); // Legal
}
Run Code Online (Sandbox Code Playgroud)
这个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};
}
Run Code Online (Sandbox Code Playgroud)
因此,在某些情况下,它似乎A()是一个左值。还是这里发生了其他事情?希望得到一些解释,最好是对 C++17 标准的引用。
更新:@Brian 发现这是赋值给右值的重复:为什么编译?. 但如果有人能在 C++ 标准中找到合适的参考,我将不胜感激。