为什么std :: tuple会分解为rvalue引用

时间:2016-11-15 08:41:02

标签: c++ c++17

为什么std :: tuple会分解成右值引用?

#include <tuple>

template <typename, typename> struct same_type;
template <typename T> struct same_type<T, T> {};

void foo() {
  std::tuple tuple(1, 'a', 2.3, true);
  auto[i, c, d, b] = tuple;
  same_type<decltype(i), int &&>{};
  same_type<decltype(c), char &&>{};
  same_type<decltype(d), double &&>{};
  same_type<decltype(b), bool &&>{};
}

使用gcc trunk编译时没有错误。 我本来期望普通类型,例如。

same_type<decltype(i), int>{};

Live example

1 个答案:

答案 0 :(得分:9)

GCC错误。应用于结构化绑定的VALUE_OF_INPUT返回引用的类型,对于类似元组的情况,它是decltype返回的确切类型。换句话说,语言在这里非常努力地隐藏这些实际上是引用的事实。

[dcl.type.simple]/4

  

对于表达式std::tuple_elemente表示的类型定义为   如下:

     
      
  • 如果decltype(e)是未加密码的 id-expression 命名结构化绑定([dcl.struct.bind]),e是引用的类型,如   结构化绑定声明的规范;
  •   
  • [...]
  •   

[dcl.struct.bind]/3

  

否则,如果表达式decltype(e)是a   格式良好的整数常量表达式[...]给定类型std::tuple_size<E>::value   由Ti指定,每个std::tuple_element<i, E>::type是一个   使用初始化程序初始化的“引用vi”类型的变量,   如果初始化器是a,则引用是左值引用   否则左值和右值参考;引用的类型是Ti