微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

聚合/指定的C ++结构初始化:直接引用另一个字段 详细信息

如何解决聚合/指定的C ++结构初始化:直接引用另一个字段 详细信息

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

#include <stdio.h>


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

  return 0;
}

我们在s.b的初始化中使用s.a。但是,我们需要引用s.a到s。是否可以直接将s.a简称为.a或类似名称?例如,这将可以在初始化如下所示的结构数组时使用相同的语法:

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

解决方法

是否可以仅将s.a或类似名称直接引用.a

否,.a在此情况下是指示符,在用于初始化a的 brace-or-equal-initializer 中不能引用它。给定的数据成员通过其匹配的指示符。

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引入了指定的初始化程序,这是the grammar for braced-init-lists引入的C ++ 20新功能:

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

其中the grammar of designated-initializer-list是:

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

,并且其中designated-initializer-clause:s的语法为:

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

最后a designator是:

designator:
  . identifier

现在,brace-or-equal-initializer不允许以任何方式引用同一对象的另一个指示符。请注意,此处的指示符和 other 标识符(例如,将结构的数据成员引用为 brace-or-equal-initializer initializer-clause 或嵌套的 braced-init-list :s的一部分/ em>。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。