结构化绑定的decltype(auto)应该是引用吗?

时间:2017-06-22 11:31:44

标签: c++ language-lawyer c++17 structured-bindings

考虑一个例子:

#include <iostream>
#include <type_traits>
#include <tuple>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto [ a, b ] = tup;
    decltype(auto) e = a;
    std::cout << std::boolalpha << std::is_reference_v<decltype(e)> << std::endl;
}

clang(输出:false)和gcc(输出:true)在这个简单的情况下不一致。记住,例如e try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen 应该是参考还是gcc错误?或者代码可能不正确?

1 个答案:

答案 0 :(得分:18)

标识符本身是引用。来自[dcl.struct.bind]/3

  

给定由std​::​tuple_­element<i, E>​::​type指定的类型T i ,每个v i 是“对T i 的引用类型的变量“使用初始化程序初始化,如果初始化程序是左值,则引用是左值引用,否则为右值引用;引用的类型是T i

也就是说,ab都是int&&

decltype(auto)实际行为的方式来自[dcl.type.auto.deduct]

  

如果占位符是decltype(auto)类型说明符,则T应仅为占位符。 T推导出的类型按照[dcl.type.simple]中的描述确定,好像edecltype的操作数。

这个措辞真的很尴尬,但最终:

decltype(auto) e = a;
~~~~~~~~~~~~~~

表示:

decltype( a  ) e = a;
         ~~~~

decltype(a)表示来自[dcl.type.simple]/4.1

  

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

a引用类型int,因此e必须为int。这意味着它不是参考,而且铿锵是正确的。提起81176