考慮這一段代碼:編譯器行爲構建虛基類時
#include <iostream>
class A {
public:
A(int s) { std::cout << "A(" << s << ")\n"; }
};
class B1 : virtual public A {
public:
B1(int s1, int s2)
: A{s1} { std::cout << "B1(" << s1 << "," << s2 << ")\n"; }
};
class B2 : virtual public A {
public:
B2(int s1, int s2)
: A{s1} { std::cout << "B2(" << s1 << "," << s2 << ")\n"; }
};
class C1 : public B1, public B2 {
public:
C1() : B1{1,2}, B2{3,4}, A{5} {}
};
class C2 : public B1, public B2 {
public:
C2() : B1(1,2), B2(3,4), A{5} {}
};
int main()
{
std::cout << "Create c1:\n";
C1 c1;
std::cout << "\n";
std::cout << "Create c2:\n";
C2 c2;
}
類A是一個虛基類的B1和B2。類C1和C2是相同的,除了C1使用{...}
和C2使用(...)
來構造B1和B2。
由於此處使用了虛擬繼承,所以類A應構建爲C1或C2構造的一部分。
如果我編譯此代碼與微軟VS2015,它在運行時產生這樣的輸出:
Create c1:
A(5)
B1(1,2)
B2(3,4)
Create c2:
A(5)
B1(1,2)
B2(3,4)
這正是我所期望的。
但是,如果我與海灣合作委員會(6.1.0)編譯它,它會產生這樣的輸出:構建C2時
Create c1:
A(5)
A(1)
B1(1,2)
A(3)
B2(3,4)
Create c2:
A(5)
B1(1,2)
B2(3,4)
這裏,構建C1當A的構造函數被調用三次,但只有一次。
這是GCC中的錯誤還是我誤解了一些東西?
您可能會考慮添加常規C++標記,以獲得更廣泛的受衆。 – Jonas
好的,@Jonas,我用C++替換了C++ 11標籤。 (我不能超過5個標籤。) – oz1cz
您是否也嘗試過Clang?我99%確定這是一個錯誤。 –