为什么 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
而不是 x
和 y
的声明。 e
的类型是 std::tuple<int&, int&>
,而 decltype(std::get<1>(e))
给你 int&
.
考虑以下使用 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
而不是 x
和 y
的声明。 e
的类型是 std::tuple<int&, int&>
,而 decltype(std::get<1>(e))
给你 int&
.