我有一个类 X,其两个构造函数定义如下:
template <typename T>
class X {
template <typename U>
X(U& u) {
// some logic
}
X(const Y<T>& y) {
// some other logic
}
};
类 Y 有一个静态方法,它返回类型 Y 的对象。
template <typename T>
class Y {
static Y<T> myStaticMethod(const T& t) {
// some logic
}
};
现在,如果我尝试使用以下代码:
const Y<double>& obj = Y<double>::myStaticMethod(1.0);
X<double> xObj = new X<double>(obj);
使用双模板 T 和 U 的构造函数被调用,T = double 这是预期的,但 U = Y<double>*
这是相当出乎意料的。
我希望 X 的第二个构造函数被调用,但它没有发生。另外,为什么当我使用引用调用构造函数时,obj 会转换为指针?
最佳答案
考虑你的路线:
X<double> xObj = new X<double>(obj);
这告诉编译器获取新表达式的结果,并且
将它们转换为 X<double>
。新结果的类型
表达式为X<double>*
; X<double>
的唯一构造函数哪个
可以用指针调用的是 template <typename T> X:X(U& )
。
除了它也不能被调用,因为它需要绑定(bind)
非常量引用的右值。但有些编译器被破坏了,并且
无论如何都允许它。
如所写,代码不应编译,但如果编译,则应调用 X<double>
的构造函数两次。
关于c++ - 调用正确的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948496/