结构化绑定在C++ 17中引入的标识符类型有哪些?

Dan*_*ica 9 c++ reference decltype c++17 structured-bindings

据我所知,C++ 17中结构化绑定引入的标识符实际上是对某些"隐藏"变量的引用.这样

auto [ a, b ] = std::make_tuple(1, 2);
Run Code Online (Sandbox Code Playgroud)

一种等同于

auto e = std::make_tuple(1, 2);
auto& a = std::get<0>(e);
auto& b = std::get<1>(e);
Run Code Online (Sandbox Code Playgroud)

但是,如果我打印出来std::is_reference<decltype(a)>::value,我会01第二种情况下进入第一种情况.这是为什么?

sky*_*ack 9

如果我打印出来std::is_reference<decltype(a)>::value,我在第一种情况下得到0,在第二种情况下得到1.

为什么即使我们可以证明ab引用元组中的元素并且可以通过它们修改这些值?
我不是语言律师,但可能是因为这个标准(工作草案)的子弹:

if e是一个未加括号的id-expression,用于命名结构化绑定[...],decltype(e)是结构化绑定声明规范中给出的引用类型


边注.您应该使用此表单来执行此操作ab引用元组中的元素:

auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
Run Code Online (Sandbox Code Playgroud)

它遵循一个最小的工作示例:

#include <tuple>
#include <type_traits>
#include <iostream>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto & [ a, b ] = tup;
    a = 0;
    std::cout << a << ", " << std::get<0>(tup) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Coliru看到它.另一方面,您得到的是使用以下表达式的值的副本:

auto [ a, b ] = std::make_tuple(1, 2);
Run Code Online (Sandbox Code Playgroud)

是更好地解释它是比标准更容易理解一点的文章人类.