在查找一些错误时,我发现了初始化的以下行为,这似乎有些奇怪:在初始化检查现有构造函数的同时,似乎存在忽略适合构造函数模板的情况。例如,请考虑以下程序:
#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函数第三行的构造函数。为什么呢?有原因吗?还是我的语法哪里出了问题?模板似乎很好用,因为在最后一行它被成功地使用了。
我知道这个例子似乎过于复杂,但是各种简化会导致我想要展示的行为消失。此外:一个模板特化将被初始化使用,并且是我目前防止出现错误的方法。(这是一开始导致错误的地方)。
如果我的问题有任何偏差,请您原谅,我不是程序员,也不是母语使用者,这是我的第一个问题。