【发布时间】:2022-01-25 16:21:40
【问题描述】:
我试图通过here 列出的书籍来了解 C++ 中的重载解析。下面给出了我写的一个这样的示例,以清除我无法理解的输出。
#include <iostream>
struct Name
{
operator int()
{
std::cout<<"Name's int version called"<<std::endl;
return 4;
}
operator float()
{
std::cout<<"Name's float version called"<<std::endl;
return 1.1f;
}
};
int main()
{
double a = Name(); //this works and calls Name's float version. But WHY ISN'T THIS AMBIGIOUS?
long double b = Name(); //this does not work. WHY IS THIS AMBIGIOUS?
bool c = Name(); //this does not work. WHY IS THIS AMBIGIOUS?
return 0;
}
如您所见here,该程序在创建double a 时工作。但是当我尝试创建对象b 和c 时会出错。
我的问题是:
-
为什么我们没有得到对象
a的歧义错误。也就是说,在Name类中的两个转换运算符中,为什么选择float版本而不是int版本。 -
我们为什么/如何得到对象
b的歧义错误,这是一个long double。这就像a一样,我怀疑应该调用float版本,但我们得到了错误。这与上面的double a案例有何不同。 -
我们为什么/如何得到对象
c的歧义错误,即bool。在这种情况下,我怀疑可能选择了int版本,但我们得到了一个错误。这与double a版本有什么不同,它工作并使用float版本的转换函数。
我只是想了解第一个版本为什么/如何工作,而其他两个没有。
【问题讨论】:
-
我可以看到为什么
c的情况不起作用,因为它正在缩小,但我不确定为什么允许a而不允许b。 -
-
IMO 隐式提升
float到double是一个原因,operator float()返回双倍。 -
与
operator char()而不是operator int()的类似行为:int b = Name();- 好的,long c = Name();- 模棱两可。char提升为int和operator char()返回int。
标签: c++ type-conversion overloading implicit-conversion overload-resolution