考虑一个C++20程序,在函数foo
中有一个结构绑定auto [y]
。该函数返回y
,它被转换为A
类型的对象。可以使用const引用或rvalue引用构造A
。
#include <tuple>
#include <iostream>
struct A {
A(const int &) { std::cout << "A(const int &) "; }
A(int &&) { std::cout << "A(int &&) "; }
};
A foo() {
auto [y] = std::make_tuple(1);
return y;
}
int main() { foo(); }
根据C++20语言标准,应选择哪个构造函数?
Clang选择A(const int &)
,GCC选择A(int &&)
,示例:https://gcc.godbolt.org/z/5q779vE6T
其中一个编译器在这方面尚未支持这一标准吗?
int y = 1; return y;
,那么clang会使用int&&
构造函数。如果 id-expression 表示的是一个变量而不是左值(或者两个编译器在这种情况下都是错误的,或者有一些规则适用于这种情况但不适用于结构化绑定,或者其他原因),那么是不是两个编译器都是错误的呢? - eerorikay
是一个int
,因此在返回时符合 rvalue 转换的条件。在 op 的例子中,y
实际上是一个结构化绑定声明的某个未命名对象的子对象的引用。如果它是左值引用,则会停止移动。但我仍然无法确定哪一个是正确的 :( - NathanOliver