考虑一个例子:
#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
)不一致。
标识符本身就是参考文献。来自[dcl.struct.bind]/3:
给定std指定的类型Ti::元组元素
也就是说,
a
和b
都是int
但是,
decltype(auto)
的实际行为方式来自[dcl.type.auto.decrete]:
如果占位符是
decltype(auto)
类型说明符,T
应单独作为占位符。根据[dcl.type.simple]中的描述确定为T
推导的类型,就好像e
是decltype
的操作数一样。
这种措辞真的很尴尬,但最终:
decltype(auto) e = a;
~~~~~~~~~~~~~~
手段:
decltype( a ) e = a;
~~~~
和
dectype(a)
的意思是,从[dcl.type.simple]/4.1开始:
如果
e
是命名结构化绑定([dcl.struct.bind])的未限定id表达式,decltype(e)
是结构化绑定声明规范中给出的引用类型;
a
的引用类型是int
,因此e
必须是int
。这意味着它不是一个参考,而叮当声是正确的。备案81176份。
简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理
上面的代码,GCC中的一个错误和叮当声。 这个代码是正确的。 在N4296中, 在§8.3.2/6中 如果typedef(7.1.3)、类型模板参数(14.3.1)或decltype说明符(7.1.6.2)表示引用类型T的类型TR,则尝试创建类型“对cv TR的左值引用”将创建类型“对T的左值引用”,而尝试创建类型“对cv TR的右值引用”将创建类型TR。 §7.1.6.2中的decltype说明
我正在学习结构化绑定声明。我的理解是,
假设我有一个类型为 是否可以像这样以嵌套的方式访问元素类型(即在Range for循环中使用时)
强制拷贝省略是否适用于通过结构化绑定进行的分解?适用于以下哪种情况? 我怀疑只有第三种情况允许拷贝省略,因为前两种情况将通过
在[dcl.struct.bind]9.6.4中,当初始值设定项是带有