2017-01-12 6 views
3

私は適切なタイトルを明確に表現するのに苦労しました。コンストラクタが仮想継承のコピーコンストラクタを呼び出そうとしています

struct Base 
{ 
    Base(int) {} 
    virtual ~Base()=default; 
}; 

struct Derived: virtual public Base 
{ 
    Derived(float, int): Base{1} {} 
    Derived(Derived const&)=delete; 
    ~Derived()=default; 
}; 

struct Comp: private Derived 
{ 
    Comp(): Base{1}, Derived{1.0f, 1} {} 
}; 

これはコンパイルエラーを与える:

x.cc: In constructor ‘Comp::Comp()’: 
x.cc:16:34: error: use of deleted function ‘Derived::Derived(const Derived&)’ 
    Comp(): Base{1}, Derived{1.0f, 1} {} 
              ^
x.cc:10:2: note: declared here 
    Derived(Derived const&)=delete; 
    ^~~~~~~ 

なぜコピーコンストラクタは、ここで要求されるでしょうか?私が仮想継承を取り除くと(そしてBase(int)Compの初期化子リストの呼び出し)、問題は消えます。

これはgcc version 6.2.1 20161124 (Debian 6.2.1-5)です。

+0

@juanchopanza申し訳ありませんが、例をさらに簡略化したため、少し不一致でした。 – TFM

+1

本物の[mcve]を投稿してください。コードが本当にコンパイルに失敗した場合は、コンパイラとバージョンを含めます。 – juanchopanza

+0

'Comp'は' Base'から派生していないので、 'Base {1}'が 'Comp'のコンストラクタで何をすると思いますか? –

答えて

1

これはGCCのバグのようです。 ClangとGCCの両方7 accept the code

関連する問題