当前位置: 首页 > 知识库问答 >
问题:

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

鱼宜
2023-03-14

考虑一个例子:

#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)不一致。

共有1个答案

涂泰平
2023-03-14

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

给定std指定的类型Ti​::​元组元素

也就是说,ab都是int

但是,decltype(auto)的实际行为方式来自[dcl.type.auto.decrete]:

如果占位符是decltype(auto)类型说明符,T应单独作为占位符。根据[dcl.type.simple]中的描述确定为T推导的类型,就好像edecltype操作数一样。

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

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中,当初始值设定项是带有