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)
です。
@juanchopanza申し訳ありませんが、例をさらに簡略化したため、少し不一致でした。 – TFM
本物の[mcve]を投稿してください。コードが本当にコンパイルに失敗した場合は、コンパイラとバージョンを含めます。 – juanchopanza
'Comp'は' Base'から派生していないので、 'Base {1}'が 'Comp'のコンストラクタで何をすると思いますか? –