3

いくつかのエラーを追跡しているときに、次の初期化の動作に遭遇しました。これは私には奇妙に思えます。既存のコンストラクターの初期化チェック中に、コンストラクターをフィッティングするためのテンプレートが無視される場合があるようです。たとえば、次のプログラムについて考えてみます。

#include <iostream>

template<class T>
struct A {
 A() {};
 template<class S>
 A(const A<S>& a) {std::cout << "constructor template used for A" << std::endl;};
};

template<class T>
struct B{
 B() {};
 B(const B<int>& b) {std::cout << "constructor used for B" << std::endl;};
};

int main() {
 A<int> a;
 B<int> b;
 A<int> aa = a;
 B<int> bb = b;
 A<double> aaa = a;
}

私にとって、これは出力を生成します

constructor used for B
constructor template used for A

これは、mainの3行目でコンストラクターを使用しないことを意味します。なぜだめですか?理由はありますか?それとも私の構文はどこかでずれていますか?テンプレートは最後の行で正常に使用されているため、機能しているようです。

例が非常に複雑に見えることは知っていますが、さまざまな単純化により、表示したい動作がなくなりました。また、テンプレートの特殊化は初期化によって使用され、これがエラーの原因となるのを現在防ぐ方法です(最初にエラーが発生した場合)。

私の質問がなんらかの形でオフになっている場合は申し訳ありません。私はプログラマーではなく、ネイティブスピーカーでもありません。これが私の最初の質問です。ご容赦ください。

4

3 に答える 3

4

コンパイラーは、暗黙的に宣言された非テンプレートコピーコンストラクターに、と同等の署名を提供します。

A(const A& a);

テンプレートコンストラクターはユーザー定義のコピーコンストラクターとは見なされないためです。つまり、コピーコンストラクターは非テンプレートである必要があります。

暗黙的に宣言されたコピーコンストラクターは、テンプレートバージョンよりもオーバーロードの解決に適しています。これは、A<T>からコピーコンストラクトをコピーするときに呼び出されるコンストラクターA<T>です。これは、ユーザー定義の簡単な例で説明できますA(const A&)

#include <iostream>

template<class T>
struct A 
{
 A() {};

 A(const A& a) {
   std::cout << "copy constructor used for A" << std::endl;
 }

 template<class S>
 A(const A<S>& a) {
   std::cout << "constructor template used for A" << std::endl;
 }
};

int main()
{
  A<int> ai;
  A<double> ad = ai; /  calls template conversion contructor
  A<int> ai2 = ai;   // calls copy constructor A(const A&);
}
于 2013-02-27T15:31:35.227 に答える
4

C++11規格のパラグラフ12.8/7による:

クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。

さらに、パラグラフ12.8 / 2によると:

クラスXの非テンプレートコンストラクターは、最初のパラメーターがタイプX&、const X&、volatile X&、またはconst volatile X&であり、他のパラメーターがないか、他のすべてのパラメーターにデフォルトの引数がある場合、コピーコンストラクターです(8.3.6 )。

したがって、コンパイラは、この行の実行中に呼び出される暗黙のコピーコンストラクタをここで生成します。

A<int> aa = a;

これは、対応する出力が表示されない理由を説明しています。

于 2013-02-27T15:35:15.503 に答える
0

これは、テンプレート化されたctorがコピーctorではないためです。https://stackoverflow.com/a/1249848/341065も参照してください。

于 2013-02-27T15:31:25.147 に答える