gpt4 book ai didi

c++ - 调用正确的构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:52 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com