2017-12-10 186 views
6

Skompilowałem kod z GCC z włączonymi -Wall i -Wextra. Ten kod generuje ostrzeżenie:Czy powinienem się martwić o inicjatory Wmissing-field i inicjowanie agregacji w 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}; 
      ^

Byłbym zaniepokojony, że? Czy jest to błąd w GCC dla wyprowadzania tego ostrzeżenia? Wygląda na to, że nie mam pola do zainicjowania i żadnych brakujących parametrów.

Odpowiedz

7

C++ 17 pozwala na wykonywanie inicjalizacji agregacji na klasach z klasami podstawowymi. Każda klasa bazowa jest skutecznie uznawana za członka (trafiają one przed bezpośrednich członków klasy). Aby agregować inicjację, C ma dwóch "członków": C::A i C::B.

Zainicjowałeś tylko jeden.

Na pewno, B w rzeczywistości nie ma niczego do zainicjowania. Ale do -Wall, to nie różni się od tego:

struct C 
{ 
    A a; 
    B b; 
}; 

(void) C{1}; 

Dałoby to ostrzeżenie zbyt. Uciszysz go w każdym przypadku, zapewniając wyraźny inicjator dla B: (void)C{1, {}};.

Ale jeśli chodzi o standard, jest to całkowicie poprawny kod. B zostanie zainicjalizowana wartość. W obu przypadkach.

+0

No cóż ... Mam tu do czynienia z generycznym kodem, więc trudno byłoby mi dodać puste parametry :( –

+0

@GuillaumeRacicot Czy to może pomóc w poznaniu spodziewanej liczby inicjalizatorów? Można je policzyć za pomocą SFINAE. –