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

oct*_*oid 6 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 &&>{};
}
Run Code Online (Sandbox Code Playgroud)

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

same_type<decltype(i), int>{};
Run Code Online (Sandbox Code Playgroud)

实例

T.C*_*.C. 9

GCC错误.decltype应用于结构化绑定将返回引用的类型,对于类似元组的大小写,返回的确切类型std::tuple_element.换句话说,语言在这里非常努力地隐藏这些实际上是引用的事实.

[dcl.type.simple]/4:

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

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

[dcl.struct.bind]/3:

否则,如果表达式std::tuple_size<E>::value是格式良好的整数常量表达式[...]给定Ti 指定的类型std::tuple_element<i, E>::type,每个vi都是用Ti初始化程序初始化的"引用" 类型的变量,其中如果初始化程序是,则引用是左值引用否则是左值和左值参考; 引用的类型是Ti.

  • 谢谢.我重新打开了https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78358 (3认同)