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

Why does auto seemingly deduce a reference when using 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 永远不会推导出一个引用。

正如 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&.