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.
Czy kompilujesz w trybie C++ 14 dla obu? – juanchopanza
Tak, robię. Włączam też wszystkie ostrzeżenia '-Wall', ale nie otrzymuję ani jednego. – user3684240
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. –