繁体   English   中英

c++结构体的聚合/指定初始化:直接引用另一个字段

[英]Aggregate / designated initialization of c++ struct: Refer directly to another field

当使用结构的聚合/指定初始化时,可以像这样引用另一个字段:

#include <stdio.h>


int main()
{
  struct
  {
    int a;
    int b;
  }
  s = 
  {
    .a = 3,
    .b = s.a + 1,
  };

  return 0;
}

我们在sb的初始化中使用了sa,但是需要通过s来引用sa。 是否可以直接将 sa 称为.a或类似名称? 例如,这可以在初始化 arrays 结构时使用相同的语法,如下所示:

int main()
{
  struct
  {
    int a;
    int b;
  }
  s[] = 
  {
    {
      .a = 3,
      .b = s[0].a + 1,
    },
    {
      .a = 5,
      .b = s[1].a - 1,
    }
  };

  return 0;
}

在这里我们也许可以写类似.b =.a - 1的东西而不是.b = s[1].a - 1

是否可以直接将sa称为.a或类似名称?

不, .a在这种情况下是一个designator ,并且不能在用于通过其匹配的指示符初始化给定数据成员的大括号或等于初始化程序中引用它。

struct Bar { int a; };

struct Foo {
    int a;
    Bar b;
};

int main() {
    Foo f = {
     //     ^ start of braced-init-list
        .a
     // ^^ designator (for data member of Foo)
            = 1,
     //     ^^^ initializer-clause
        .b{.a = 2}
     //   ^^^^^^^^ braced-init-list
     //   referring to a designator of a 
     //   data member of Bar
    };
}

细节

指定初始化器是P0329R4引入的新 C++20 功能,是 braced -init-lists语法的一部分:

 braced-init-list: { initializer-list,opt } { designated-initializer-list,opt } { }

其中designated-initializer-list的语法是:

 designated-initializer-list: designated-initializer-clause designated-initializer-list, designated-initializer-clause

并且,其中单个指定初始化器子句:s 的语法是:

 designated-initializer-clause: designator brace-or-equal-initializer

最后, 指示符是:

 designator: . identifier

现在, 大括号或等于初始化器不允许以任何方式引用同一 object 的另一个指示符。请注意此处指示符和其他标识符之间的区别,例如将结构的数据成员引用为大括号或等于初始化器初始化器子句或嵌套的大括号初始化器列表:s。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM