【问题标题】:Nested designated initializers嵌套的指定初始化器
【发布时间】:2021-11-20 14:00:59
【问题描述】:

C++ 20 是否允许嵌套指定初始值设定项?例如:

struct Outer {
  int32_t counter;
  struct {
    std::string name;
  } inner;

  struct {
    std::optional<int32_t> value;
  } inner_optional;
};

Outer outer = {
    .counter = 100,
    .inner = {
        .name = "test" // nested
    }
};

如果允许,有人可以提供指向可信来源的链接吗?我在 cppreference 上找不到它。

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    是的,这是受支持的,cppreference - aggregate initialization 声明:

    如果初始化子句是嵌套的花括号初始化列表(不是表达式),则从该子句列表初始化相应的数组元素/类成员/公共基(C++17 起):聚合初始化是递归的。

    列表初始化是聚合的聚合初始化。

    请注意,C++ 不支持真正嵌套的 C 指定初始化程序,即 outer = {.inner.name = ""};。所需的解决方法正是您所写的。

    【讨论】:

      【解决方案2】:

      是的,显示的程序格式正确。

      适用于内部初始化器的规则与适用于最外层初始化器的规则相同。对于指定的初始化器,最外层的初始化器并不特殊。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        相关资源
        最近更新 更多