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

问题描述:

考虑这样一个例子:结构化绑定的decltype(auto)应该是一个引用吗?

#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)在这个简单的例子不同意。考虑到例如this Q&Ase应该是一个参考或是一个海湾合作委员会的错误?或者,也许代码是不合格的?

标识自己是参考文献。从[dcl.struct.bind]/3

鉴于类型T 指定由std​::​tuple_­element<i, E>​::​type,每个V 是类型的变量“到T参考”与初始化,其中,所述参考是一个左值引用初始化如果初始值是一个左值和一个右值引用,否则;引用的类型是T i

也就是说,ab都是int&&

但方式decltype(auto)实际上表现为来自[dcl.type.auto.deduct]

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

这一措词是好不尴尬,但最终:

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

表示:

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

decltype(a)手段,从[dcl.type.simple]/4.1

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

引用的类型的aint,所以e必须是int。这意味着它不是一个参考,铿锵是正确的。提起81176