函数重载,在 C++ 中对常量引用和传递值进行隐式转换

Function overloading with implicit conversion on const reference and pass by value in C++

提问人:Ramtin Farajollahi 提问时间:12/1/2022 更新时间:12/1/2022 访问量:57

问:

这里我们有函数重载,只有具有“double”类型参数的参数才能选择隐式转换,很明显为什么编译器选择这个(double 版本)版本的函数


double max(double a, double b){
    std::cout<< "double max called" << std::endl;
    return (a>b)?a:b;
}


int& max(int& a, int& b){
   std::cout << "int max called" << std::endl;
    return (a>b)?a:b;
}

int main(){

    char a{6};
    char b{9};


    auto result = max(a,b);

   
    return 0;
}

但是,当我们将第二个函数的参数更改为 const int& 时,我们使隐式转换成为可能。为什么这两个版本都需要进行隐式转换,但编译器选择带有“const int&”类型参数的版本。是因为它更接近类型“char”,还是编译器中有某种规则?


double max(double a, double b){
    std::cout<< "double max called" << std::endl;
    return (a>b)?a:b;
}


const int& max(const int& a, const int& b){
    std::cout << "int max called" << std::endl;
    return (a>b)?a:b;
}

int main(){

    char a{6};
    char b{9};


    auto result = max(a,b);

   
    return 0;
}

我希望编译器始终坚持使用更简单的版本,即按值传递

C++ 函数 重载 按引用传递

评论

5赞 Nathan Pierson 12/1/2022
这种效果可能是一种欺骗。根据对隐式转换序列进行排序的规则,积分提升(例如 to ) 优于浮积分转换(例如 自charintchardouble)
2赞 Lasersköld 12/1/2022
@NathanPierson 这句话不应该是一个答案吗?

答: 暂无答案