2017-05-02 2 views
10

のgcc-4.9の下に次のコードセグメンテーション違反は、5.4、とstd = C++ 11と6.3が、コンパイルおよび打ち鳴らす-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? 仮想継承を削除すると、segfaultが修正されます。

+5

'。しかし、実際に構築が始まるまで「派生」はありませんが、基本クラスを構築するために評価する必要がありますが、すべての基本クラスが構築されるまで、「派生」はありません。未定義の動作。 –

+0

@SamVarshavchik:標準を引用した回答として書くべきです。そのほうがいい !!! – Destructor

+0

私は実際に何かを見つけようとしましたが、数分後に何も見つけられませんでした。私はラムダがあなたの周りに来るまで、オブジェクトが実際に存在する前にあなたが「this」を持つことができない状況がないと思う。したがって、これは明示的に綴られていません。 –

答えて