使用浮点字面值调用重载函数会产生"ambiguos"错误

Ope*_*992 4 c++ overloading function

编译以下代码时:

#include <iostream>
using namespace std;

void print(int i){
    cout << i << endl;
}

void print(float i){
    cout << i << endl;
}

int main(){
    print(5);
    print(5.5)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

调用重载'print(double)'是不明确的.

但是,如果我改变了

void print(float i){
Run Code Online (Sandbox Code Playgroud)

void print(double i){
Run Code Online (Sandbox Code Playgroud)

代码编译.这是为什么?

leg*_*s2k 5

尝试不同的练习来理解这一点.删除两个重载中的任何一个将使程序编译,尽管文字没有标识匹配5.5,一个double值,它可以隐式转换为intfloat.

当两个重载都存在时,因为5.5可以隐式转换为a int或者float两者都是可行的.编译器无法在两者之间做出决定,因此错误.

在使文字成为a float5.5f,我们有一个标识匹配,float重载并且在编译器的决策中没有歧义.相反,保持文字double,5.5,改变功能从原型floatdouble同样适用,因为这是一种身份的比赛也是如此.