2015-12-28 11 views
6

Niedawno odkryłem dziwne zachowanie klang i gcc. Mam struct (MyClass), które wykorzystuje w swojej klasie inicjalizacji dla jednego ze swoich członków (active):Dlaczego klang i uchwyt gcc są wzmocnione - inicjalizacja struktur z inicjowaniem w klasie w inny sposób?

struct MyClass { 
    int something; 
    bool active = true; 
}; 

Teraz staram się podpierać zainicjowania tej klasy.

Używając klang, mogę zdecydować, czy dołączyć active na liście inicjatora (MyClass a = { 42, true};), czy nie (MyClass a = { 42 };).

Jednak używając gcc, mój kod kompiluje się tylko wtedy, gdy nie dodaję active. W przeciwnym razie wystąpi następujący błąd kompilatora:

error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’ 

Czy to błąd? Co standard mówi na ten temat? A co z VSC++? Który sposób poleciłbyś jako rozwiązanie przenośne?

Testowane przy użyciu gcc 4.9 i clang 3.5 w systemie Debian Linux.

+2

Czy kompilujesz w trybie C++ 14 dla obu? – juanchopanza

+0

Tak, robię. Włączam też wszystkie ostrzeżenia '-Wall', ale nie otrzymuję ani jednego. – user3684240

+2

W C++ 11 klasa z [niestatycznymi inicjatorami członkowskimi w klasie nie jest agregatem] (http://stackoverflow.com/q/27118535/1708801) i tak to się nie powiedzie w trybie C++ 11, ale powinien odnieść sukces w trybie C++ 14 dla obu. Jak zauważam w mojej [odpowiedź] (http://stackoverflow.com/a/27118551/1708801) na połączone pytanie gcc nie obsługiwał tego do 5.0. –

Odpowiedz

8

Zachowanie się tego kodu zmieniło się między C++ 11 i C++ 14.

W C++ 11 obecność = true oznacza, że ​​klasa nie była agregatem. Dlatego nie można używać inicjowania agregacji.

W C++ 14 klasa jest nadal agregatem, więc można ponownie użyć inicjowania agregacji.

Różnicę między kompilatorami można wytłumaczyć tym, że jest nowsza od drugiej. Korzystanie z compiler explorer Widzę, że gcc 4.9.x robi to źle, ale zostało to naprawione w gcc 5.1.

+0

Używanie klangu w trybie C++ 11 wspiera tę hipotezę. Narzeka na te same rzeczy, co gcc. – user3684240

+0

Domyślam się, że jest to technicznie błąd w trybie C++ 11 w klangu - chociaż jest on w większości nieszkodliwy, chyba że szczególnie poszukujesz błędu, gdy ten konstrukt jest używany. –

+0

@MatsPetersson wydaje się poprawny w clang i bugged w g ++ –

Powiązane problemy