结构化绑定的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。
也就是说,a
和b
都是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)
是引用类型,如结构化绑定声明的规范中给出的;
的引用的类型的a
是int
,所以e
必须是int
。这意味着它不是一个参考,铿锵是正确的。提起81176。