2017-12-10 27 views
6

-Wall-Wextraを有効にして、GCCでコードをコンパイルしました。Wmissing-field-initializersとC++ 17の集約初期化について心配すべきでしょうか?

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のバグですか?私はフィールドを初期化する必要はなく、欠落しているパラメータもないようです。

答えて

7

C++ 17では、基本クラスを持つクラスに対して集約初期化を実行できます。各基本クラスは実質的にメンバーとみなされます(クラスの直接メンバーの前にあります)。したがって、初期化を集約するには、Cには2つの "メンバー"があります:C::AC::Bです。

初めて初期化しました。

必ずああ、Bは実際に初期化するためには何もありません。しかし-Wallに、それはこのと何ら変わりません:

struct C 
{ 
    A a; 
    B b; 
}; 

(void) C{1}; 

これも警告を与えるだろう。どちらの場合でも、B(void)C{1, {}};の明示的なイニシャライザを指定することで、それを無音にします。

しかし、これまでの標準に関しては、これは完全に有効なコードです。 Bは値が初期化されます。どちらの場合にも。

+0

ああ...私はそこにジェネリックコードを扱っているので、空のパラメータを追加するのは難しいでしょう:( –

+0

@GuillaumeRacicot期待されるイニシャライザの数を知るのに役立つでしょうか? SFINAE。 –