为什么auto在使用结构化绑定时似乎会推断出引用?

时间:2017-12-08 16:28:56

标签: c++ c++17 structured-bindings

考虑以下使用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永远不会推断参考。

1 个答案:

答案 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,而不适用于xy的声明。 e的类型为std::tuple<int&, int&>,而decltype(std::get<1>(e))为您提供int&