Nawiązując do this question about multiple (virtual) inheritance, chciałbym zapytać o prostym MWE sprawia, że g ++ 5.2.0 zdenerwowany, natomiast szczęk ++ 3.6.2 obsługuje po prostu w porządku, bez skarg na wszystko, nawet z zestawem -Wall
i -Wextra
. Tak oto MWE:wirtualnej spadków i jednolity inicjalizacji w C++
class Z {};
class A : virtual Z { protected: A() {} };
class B : virtual Z { protected: B() {} };
class C : A, B { public: C() : A{}, B{} {} };
int main() { C c{}; return 0; }
przeciwieństwie brzękiem ++ g ++ narzeka tak:
gccodd.c++: In constructor ‘C::C()’:
gccodd.c++:2:34: error: ‘A::A()’ is protected
class A : virtual Z { protected: A() {} };
^
gccodd.c++:4:39: error: within this context
class C : A, B { public: C() : A{}, B{} {} };
^
gccodd.c++:3:34: error: ‘B::B()’ is protected
class B : virtual Z { protected: B() {} };
^
gccodd.c++:4:39: error: within this context
class C : A, B { public: C() : A{}, B{} {} };
^
Wymiana jednolitej inicjalizacji w konstruktora C jest ze starej formy działa dobrze choć i zarówno dzyń ++ i g ++ są zadowoleni z następujące:
class C : A, B { public: C() : A(), B() {} };
daje to dwie wyraźne opcje:
- Kodeks narusza standard w pewien sposób, przez co jego wynik jest niezdefiniowany (tj. Każdy wynik jest akceptowalny).
- Jeden z dwóch kompilatorów ma błąd związany z jednolitą inicjalizacją i wieloma dziedziczeniami + wirtualnymi.
Gdyby to była kwestia głosowania (1) może wygrać, bo ICPC 15.0.0 mówi co następuje:
gccodd.c++(4): error #453: protected function "A::A()" (declared at line 2) is not accessible through a "A" pointer or object
class C : public virtual A, public virtual B { public: C() : A{}, B{} {} };
^
gccodd.c++(4): error #453: protected function "B::B()" (declared at line 3) is not accessible through a "B" pointer or object
class C : public virtual A, public virtual B { public: C() : A{}, B{} {} };
^
tak, to on (1) lub (2)? A jeśli to pierwszy przypadek, to co jest nie tak z moim MWE?
Brzmi jak błąd. Nie ma powodu, by sądzić, że tu będzie UB. –
VC++ 14.0 również to kompiluje, chociaż IntelliSense narzeka na to. – Fireho
GCC jest błędny, jeśli chodzi o [inicjowanie agregacji klas podstawowych w inicjatorze pamięci] (http://coliru.stacked-crooked.com/a/8c60d42406381caa). – 0x499602D2