结构化绑定中的变量类型

时间:2018-11-24 19:22:42

标签: c++ c++17 auto decltype type-deduction

#include <type_traits>

int main()
{
    int arr[1] = { 6 };

    auto& ref1 = arr[0];  
    static_assert( std::is_same_v<decltype( ref1 ), int&> ); //ok

    auto& [ ref2 ] = arr;
    static_assert( std::is_same_v<decltype( ref2 ), int> ); //ok
    static_assert( std::is_same_v<decltype( ref2 ), int&> ); //error
}

在该示例中,标识符ref1ref2之间的相应区别是什么?据我了解,结构绑定中的ref2也具有引用类型,但是为什么decltype为其指示非引用类型?

1 个答案:

答案 0 :(得分:9)

decltype(e)的行为取决于给出的e作为参数。对于结构化绑定,decltype产生以下内容,[dcl.type.simple]

  

对于表达式e,由decltype(e)表示的类型定义如下:

     
      
  • 如果e是未命名的 id-expression ,命名结构化绑定,则decltype(e)引用类型,如规范结构化绑定声明
  •   

以数组类型表达式作为初始化程序的结构化绑定声明的引用类型为元素[dcl.struct.bind]的类型:

  

如果E是元素类型为T的数组类型,则标识符列表中的元素数应等于E的元素数。每个 v i 是一个左值的名称,该左值引用数组的元素 i ,其类型为T引用的类型为T 。 [注意:T的顶级简历限定词是简历。 — 尾注]