我和我的 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 发现这是分配给右值的副本:为什么会编译?. 但如果有人能在 C++ 标准中找到适当的参考,我将不胜感激。