在追求一些错误时,我偶然发现了以下初始化行为,这对我来说似乎很奇怪:虽然对现有构造函数进行了初始化检查,但似乎有些情况是忽略了适合构造函数的模板。例如考虑以下程序:
#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 的第三行中的构造函数。为什么不?有原因吗?或者我的语法在某个地方?该模板似乎有效,因为它已在最后一行成功使用。
我知道这个例子看起来过于复杂,但各种简化让我想要展示的行为消失了。另外:初始化将使用模板特化,这是我目前防止这种导致错误的方式(它首先导致错误)。
如果我的问题有任何问题,我很抱歉,我不是程序员,我不是母语人士,这是我的第一个问题,请原谅我。