簡體   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