为啥 std::tuple 分解成右值引用
Posted
技术标签:
【中文标题】为啥 std::tuple 分解成右值引用【英文标题】:Why does std::tuple decompose into rvalue references为什么 std::tuple 分解成右值引用 【发布时间】:2016-11-15 08:41:01 【问题描述】:为什么 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 主干编译没有错误。 我本来希望使用普通类型,例如
same_type<decltype(i), int>;
Live example
【问题讨论】:
【参考方案1】:GCC 错误。应用于结构化绑定的decltype
返回引用类型,对于类似元组的情况,它是std::tuple_element
返回的确切类型。换句话说,该语言在这里非常努力地隐藏这些实际上是引用的事实。
[dcl.type.simple]/4:
对于表达式
如果e
,decltype(e)
表示的类型定义为 如下: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
。
【讨论】:
谢谢。我重新打开了gcc.gnu.org/bugzilla/show_bug.cgi?id=78358以上是关于为啥 std::tuple 分解成右值引用的主要内容,如果未能解决你的问题,请参考以下文章