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が修正されます。
'。しかし、実際に構築が始まるまで「派生」はありませんが、基本クラスを構築するために評価する必要がありますが、すべての基本クラスが構築されるまで、「派生」はありません。未定義の動作。 –
@SamVarshavchik:標準を引用した回答として書くべきです。そのほうがいい !!! – Destructor
私は実際に何かを見つけようとしましたが、数分後に何も見つけられませんでした。私はラムダがあなたの周りに来るまで、オブジェクトが実際に存在する前にあなたが「this」を持つことができない状況がないと思う。したがって、これは明示的に綴られていません。 –