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

W.F*_*.F. 27 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;
}
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,clang(输出:)falsegcc(输出:)true不一致.记住,例如这个Q&As应该e是一个参考还是一个gcc bug?或者代码可能不正确?

Bar*_*rry 18

标识本身就是参考文献.来自[dcl.struct.bind]/3:

给定由类型T i指定的类型std?::?tuple_­element<i, E>?::?type,每个v i是用初始化器初始化的类型"对T i的引用"的变量,其中如果初始化器是左值,则引用是左值引用,否则是左值引用; 引用的类型是T i.

也就是说,a而且bint&&.

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

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

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

decltype(auto) e = a;
~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

手段:

decltype( a  ) e = a;
         ~~~~
Run Code Online (Sandbox Code Playgroud)

并且decltype(a)来自[dcl.type.simple] /4.1:

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

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