2017-05-02 21 views
10

下GCC-4.9,5.4以下代碼段錯誤,和6.3與STD = C++ 11,但編譯和下鐺-3.7運行正常,和VS2015更新3與虛擬繼承初始化列表中的lambda捕獲此gcc錯誤?

struct A 
{ 
    int Func() { return x++; } 
    int x = 5; 
}; 

struct B 
{ 
    B(int) {} 
}; 

struct Derived : public virtual A, public B 
{ 
    Derived() 
     : A() 
     // , B(this->Func()) // This works! 
     , B([this](){ return this->Func(); }()) // But this segfaults. 
    { 
    } 
}; 

int main() 
{ 
    Derived c; 
} 

這是中的錯誤GCC? 刪除虛擬繼承可修復段錯誤。

+5

'this'指Derived'的'一個實例。但是直到它的構造實際開始時纔有'Derived',然而,爲了構造基類需要評估這個',但是直到所有的基類都被構造出來,就沒有'Derived'。未定義的行爲。 –

+0

@SamVarshavchik:你應該把它寫成引用標準的答案。那會更好! – Destructor

+0

我實際上試圖找到一些東西,但幾分鐘後我看不到任何東西。我想直到lambdas來臨時,你不可能有一種情況,即在對象實際存在之前你可以擁有一個'this';因此沒有明確說明。 –

回答