gpt4 book ai didi

c++ - 为什么这个对模板的调用不模棱两可?

转载 作者:IT老高 更新时间:2023-10-28 22:02:35 25 4
gpt4 key购买 nike

我声明了两个模板,第一个将参数 x 从类型 T 转换为类型 U,第二个从类型 U 键入 T。如果我用 10 调用 cast,编译器不会提示。我认为两者都符合使用要求,因此应该有歧义,这是真的吗?此代码打印 10。

#include <iostream>

template<typename T, typename U>
U cast(T x) {
return static_cast<U>(x);
}

template<typename T, typename U>
T cast(U x) {
return static_cast<T>(x);
}

int main() {
std::cout << cast<int,float>(10) << '\n';
}

最佳答案

当您使用 cast<int, float> 时, 两个模板都被考虑。

template<typename T=int,typename U=float>
U cast(T x);
template<typename T=int,typename U=float>
T cast(U x);

然后我们替换:

template<typename T=int,typename U=float>
float cast(int x);
template<typename T=int,typename U=float>
int cast(float x);

此时,没有要推断的类型。所以我们去重载决议。

在一种情况下,我们可以使用 int并转换为 float调用 Actor ,而在另一个我们采取 int并转换为 int调用 Actor 。请注意,我根本没有研究 Actor 阵容的 body ;正文与重载决议无关。

第二个非转换(在调用点)是更好的匹配,因此选择了重载。

如果你这样做了:

std::cout << cast<int>(10) << "\n";

事情变得更有趣了:

template<typename T=int,typename U=?>
U cast(T x);
template<typename T=int,typename U=?>
T cast(U x);

对于第一个,我们无法推断 U .第二个我们可以。

template<typename T=int,typename U=?>
U cast(int x);
template<typename T=int,typename U=int>
int cast(int x);

所以这里我们有一个可行的重载,它被使用了。

关于c++ - 为什么这个对模板的调用不模棱两可?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609797/

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