2017-11-16 6 views
0

私はinheriting constructors質問を読んで、広くはC++コンストラクタの継承を理解しています。私はXを形成し、Bを構築するために(2)を使用することができるがAからBを構築する(1)を使用することができないようC++の基本クラスからコンストラクタとしてコピー/移動コンストラクタを継承

class X; 

class A { 
    A(const A& a); // (1) 
    A(const X& x); // (2) 
}; 

class B : A { 
    using A::A; 
} 

コピーコンストラクタは特別です。

template<class...T> B(T... t) : A(t...) {} 

は、このテンプレートコンストラクタはこれの副作用が何であるかBの形に

私はを知りたいA.を構築できるようになります:私はBにテンプレートコンストラクタを追加することができますしかし

どのコンストラクタが効果的に定義していますか?

たとえば、このようにAをBに移動できますか? Bでまだusing A::A宣言が必要ですか? std :: forward black magicを追加する必要がありますか?

+0

'テンプレート B(T ... t)'はコピーコンストラクタではありません。 'T &&'であっても、後の場合は、デフォルトのコピーコンストラクタ(' B b(non_const_b);)を完全に一致させることができます。 – Jarod42

答えて

1

このメソッドの副作用とは、どのようなコンストラクタが効果的に定義していますか?

テンプレートテンプレートは1つだけ定義されます。その特殊化はAという値で初期化しようとします。

たとえば、このようにAをBに移動できますか?

転送していません。値を渡すので、明示的な​​でさえ、引数をAベースに移動しません。

BでA :: A宣言を使用する必要がありますか?

あなたが持っている可能性があります。オーバーロード解決を行うときはテンプレート以外のテンプレートが優先されるため、あいまいではありません。継承されたc'torは代わりに​​で使用されます(const参照はxvalueにバインドできるため)。基本的には、選択されているオーバーロードが常にあなたが望むものとは限りません。

std :: forward black magicを追加する必要がありますか?

テンプレート「c'tor?絶対に。既定で転送参照を使用します。そして当然std::forwardは転送の仕事をする。

+0

さて、フォワーディングを使用しましたが、Visual Studio 2017で、コンパイラはテンプレート宣言でデフォルトのコンストラクタを解決しようとします。witchはstd :: forward <>で失敗します。だから私はB()=デフォルトを追加しなければならない。それはGCCでうまく動作します。このすべてを考慮すると、私はコンストラクタの "完全な継承"を行うために3行が必要なようです。あなたには正しいようですか? –

+0

@GuillaumeGris - テンプレートが関係していると、ビジュアルスタジオが不合格であることが知られています。 GCCは右側にありますが、MSVCのためにはその必要があります。 – StoryTeller

関連する問題