【问题标题】: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

【问题讨论】:

    标签: c++ c++17


    【解决方案1】:

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

    [dcl.type.simple]/4:

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

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

    [dcl.struct.bind]/3:

    否则,如果表达式 std::tuple_size&lt;E&gt;::value 是 格式良好的整数常量表达式 [...] 给定类型 Tistd::tuple_element&lt;i, E&gt;::type指定,每个vi是一个 使用初始化程序初始化的“引用Ti”类型的变量, 如果初始化器是一个左值引用,则该引用是一个左值引用 否则为左值和右值引用;引用的类型是Ti

    【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多