上this question about multiple (virtual) inheritance跟進統一初始化,我想打聽一個簡單的MWE,使G ++ 5.2.0心煩而鐺++ 3.6.2處理它就好了,沒有在投訴所有,甚至與-Wall
和-Wextra
集。因此,這裏的MWE:虛繼承和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; }
不像鐺++,G ++抱怨這樣的:
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{} {} };
^
與舊錶更換統一初始化用C的構造函數工作正常,雖然兩者鐺++和g ++是高興的以下:
class C : A, B { public: C() : A(), B() {} };
這產生了兩個明顯的選擇:
- 代碼以某種方式違反了標準,導致結果未定義(即任何結果都可以接受)。
- 其中一個編譯器有一個與統一初始化和多重+虛擬繼承相關的錯誤。
如果它是投票的問題,(1)可能贏,因爲ICPC 15.0.0說以下內容:
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{} {} };
^
那麼,是不是(1)或(2)?如果是前一種情況,那麼我的MWE有什麼問題?對象或T
類型的參考的
聽起來像一個錯誤。沒有理由認爲這裏會有UB。 –
雖然IntelliSense對此抱怨,但VC++ 14.0也編譯得很好。 – Fireho
當涉及到[mem初始化程序中的基類的聚合初始化]時,GCC有問題(http://coliru.stacked-crooked.com/a/8c60d42406381caa)。 – 0x499602D2