考虑以下使用C ++ 17结构化绑定的代码:
int a = 0, b = 0;
auto [x, y] = std::tie(a, b);
y = 1;
std::cout << a << ' ' << b << '\n';
由于我使用了auto
,我希望打印0 0
代码为y
应该是副本。但是,它会打印0 1
。为什么?我认为裸auto
永远不会推断参考。
答案 0 :(得分:18)
如cppreference所述,[
之前的声明部分(即您的情况下为auto
)不适用于引入的标识符。相反,它适用于由编译器在封面下创建的隐藏变量。您的结构化绑定声明
auto [x, y] = std::tie(a, b);
大致相当于
auto e = std::tie(a, b);
decltype(std::get<0>(e)) x = std::get<0>(e);
decltype(std::get<1>(e)) y = std::get<1>(e);
如您所见,auto
适用于隐藏变量e
,而不适用于x
和y
的声明。 e
的类型为std::tuple<int&, int&>
,而decltype(std::get<1>(e))
为您提供int&
。