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

结构化绑定中的变量类型

邵亦
2023-03-14
#include <type_traits>

int main()
{
    int arr[1] = { 6 };

    auto& ref1 = arr[0];  
    static_assert( std::is_same_v<decltype( ref1 ), int&> ); //ok

    auto& [ ref2 ] = arr;
    static_assert( std::is_same_v<decltype( ref2 ), int> ); //ok
    static_assert( std::is_same_v<decltype( ref2 ), int&> ); //error
}

在该示例中,标识符ref1ref2之间的相应区别是什么?据我所知,结构绑定中的ref2也有一个引用类型,但是为什么decltype为它指明了一个非引用类型呢?

共有1个答案

陶俊晤
2023-03-14

decltype(e)的行为不同,具体取决于作为参数给出的e。对于结构化绑定,decltype生成如下内容,[dcl.type.simple]:

对于表达式e,由decltype(e)表示的类型定义如下:

  • 如果e是命名结构化绑定的未限定id表达式,decltype(e)是结构化绑定声明规范中给出的引用类型

以数组类型表达式作为初始化器的结构化绑定声明的引用类型是元素[dcl.struct.bind]的类型:

如果E是元素类型为T的数组类型,则标识符-列表中的元素数应等于E的元素数。每个vi是一个左值的名称,该左值引用数组的元素i,其类型为T;引用的类型为T。[注:T的顶级cv-限定符是cv。-结束注释]

 类似资料:
  • 在[dcl.struct.bind]9.6.4中,当初始值设定项是带有

  • 我一直在编写一组类来允许一个简单的类似python的-函数。下面的片段(几乎)和预期的一样工作。然而,两个变量和不是。 我一直在使用gcc 7.3.0。以下是MCVE:

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 为什么结构化绑定是通过一个唯一命名的变量和所有模糊的“name is bind to”语言定义的? 我个人认为结构化绑定的工作原理如下。给定一个结构: 以下内容: 大致相当于 数组和元组的等价展开式。但显然,这太简单了,而且有所有这些模糊的特殊语言用来描述需要发生的事情。 很明显,我遗漏了一些东西,但确切的情况是什么,一个定义良好的扩展,比如说,折叠表达式,在标准语言中读起来要简单得多? 似乎结构

  • 我试图理解C17中引入的结构化绑定。对我来说,关于cp首选项的解释并不明显,但看起来像 大致相当于(不考虑数组的情况) 这里的关键点是,不是独立定义的变量,而是返回值成员的别名。和应用于返回值,而不是别名(这里的语法可能会误导)。例如,请参见CPPPreference示例 如果是独立定义的变量,则

  • 2、结构类型变量的定义 在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。其定义格式如下: [变量名] 结构名 <[字段值表]>