【问题标题】:initializer list with struct and inheritance [duplicate]具有结构和继承的初始化列表[重复]
【发布时间】:2019-08-03 16:16:21
【问题描述】:

我正在为结构使用初始化列表。但是,它不适用于继承。

这段代码很好。

struct K {
int x, y;
};

K k {1, 2};

但是,这会产生错误。

struct L : public K {};
L l {1, 2};

另外,这不起作用。

struct X {
    int x;
};

struct Y : public X {
    int y;
};

Y y {1, 2};

有没有办法将初始化列表与继承的结构一起使用。我在模板中使用它们,因此无论它是否是继承类,它都不会编译。

【问题讨论】:

    标签: c++ inheritance struct initialization initializer-list


    【解决方案1】:

    您的代码将适用于 C++17。由于 C++17,LY 都被视为 aggregate type

    没有virtual, private, or protected (since C++17) 基类

    那么brace elision是允许的;即子聚合的嵌套初始化列表周围的大括号可以被省略,然后你可以只写L l {1, 2};Y y {1, 2};(而不是L l {{1, 2}};Y y {{1}, 2};)。

    如果聚合初始化使用copy- (until C++14)list-initialization 语法(T a = {args..} or T a {args..} (since C++14)),嵌套初始化列表周围的大括号可能会被省略(省略),在这种情况下,初始化子句的数量必要时用于初始化相应子聚合的每个成员或元素,随后的初始化子句用于初始化对象的以下成员。

    LIVE

    在 C++17 之前它不起作用,因为改为执行 list initialization,尝试使用适当的构造函数并失败。

    【讨论】:

    • 谢谢。我现在知道发生了什么。
    【解决方案2】:

    有没有办法将初始化列表与继承的结构一起使用。

    如果添加具有正确参数的构造函数,则可以使用初始化列表。

    struct K
    {
       int x, y;
       K(int x_, y_) : x(x_), y(y_) {}
    };
    
    struct L : public K
    {
       L(int x_, y_) : K(x_, y_) {}
    };
    
    K k {1, 2};
    L l {1, 2};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多