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(输出:)false和gcc(输出:)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而且b都int&&.
但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)是结构化绑定声明规范中给出的引用类型 ;
该引用类型的a是int,所以e必须是int.这意味着它不是参考,而且铿锵是正确的.提起81176.
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |