【问题标题】:Should I be worried about Wmissing-field-initializers and aggregate initialization in C++17?我应该担心 C++17 中的 Wmissing-field-initializers 和聚合初始化吗?
【发布时间】:2018-05-23 23:52:13
【问题描述】:

我在启用-Wall-Wextra 的情况下使用GCC 编译了一些代码。此代码会产生警告:

struct A { A(int) {} };
struct B {};

struct C : A, B {};

int main() {
    (void) C{1};
}
main.cpp: In function 'int main()':
main.cpp:11:15: warning: missing initializer for member 'C::<anonymous>' [-Wmissing-field-initializers]
     (void) C{1};
               ^

我应该担心吗?这是 GCC 中用于输出此警告的错误吗?看来我没有要初始化的字段,也没有缺少参数。

【问题讨论】:

    标签: c++ c++17 aggregate-initialization


    【解决方案1】:

    C++17 允许您对具有基类的类执行聚合初始化。每个基类都被有效地视为一个成员(它们位于类的直接成员之前)。所以要聚合初始化,C 有两个“成员”:C::AC::B

    你只初始化了一个。

    哦,当然,B 实际上没有任何要初始化的东西。但是对于-Wall来说,和这个没什么区别:

    struct C
    {
      A a;
      B b;
    };
    
    (void) C{1};
    

    这也会发出警告。在任何一种情况下,您都可以通过为 B: (void)C{1, {}}; 提供显式初始化程序来使其静音。

    但就标准而言,这是完全有效的代码。 B 将被初始化。无论哪种情况。

    【讨论】:

    • 哦,好吧......我正在处理通用代码,所以我很难添加空参数:(
    • @GuillaumeRacicot 是否可以帮助您了解预期的初始化程序数量?这些可以使用 SFINAE 进行计数。
    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 2012-11-02
    • 2014-03-06
    • 2021-04-27
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多