いくつかのエラーを追跡しているときに、次の初期化の動作に遭遇しました。これは私には奇妙に思えます。既存のコンストラクターの初期化チェック中に、コンストラクターをフィッティングするためのテンプレートが無視される場合があるようです。たとえば、次のプログラムについて考えてみます。
#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行目でコンストラクターを使用しないことを意味します。なぜだめですか?理由はありますか?それとも私の構文はどこかでずれていますか?テンプレートは最後の行で正常に使用されているため、機能しているようです。
例が非常に複雑に見えることは知っていますが、さまざまな単純化により、表示したい動作がなくなりました。また、テンプレートの特殊化は初期化によって使用され、これがエラーの原因となるのを現在防ぐ方法です(最初にエラーが発生した場合)。
私の質問がなんらかの形でオフになっている場合は申し訳ありません。私はプログラマーではなく、ネイティブスピーカーでもありません。これが私の最初の質問です。ご容赦ください。