首页 > 解决方案 > c++函数重载匹配

问题描述

#include<iostream>

using namespace std;

void foo(const long& a)
{
    cout << "long version";
}

void foo( float& a)
{
    cout << "float version" << endl;
}


int main()
{
    int a = 3;
    foo(a);
}

但是,根据C++ 入门,上面的示例将输出“长版本” :

当我们调用一个在引用或指针参数是否引用或指向 const 方面不同的重载函数时,编译器使用参数的 const 性来决定调用哪个函数:

程序应该输出不包含 const 的版本,因为它们具有相同的算术转换优先级,但由于某种原因,程序总是选择具有 const 的版本。

谁能向我解释为什么编译器选择 const 版本?非常感谢您的帮助:)

标签: c++overloading

解决方案


您正在使用 type 的参数调用该函数int,但该函数将引用 a longor float,它们是不同的类型,作为参数。您不能将一种类型的引用绑定到另一种类型(最多const/volatile限定符,如果它们不通过类层次结构相关)。

因此,编译器试图做的是创建一个参数类型的临时对象,该对象int通过转换(算术转换)从参数初始化,并将引用绑定到该对象。

临时对象是右值,这意味着它们不能绑定到非const左值引用。float因此,从int传递给它的对象创建对象后, foos 参数将无法绑定到它。因此,float过载是不可行的。

剩下的唯一超载就是那个long。这个是可行的,因为在创建临时long对象之后,它可以绑定到一个const左值引用。

所以long版本被调用。


const只有当参数和参数的类型匹配(最多)并且参数本身是左值时,您显示的报价才适用(大部分) 。我假设您错过了围绕引用部分的相关上下文。

您不能调用将const具有不同类型的非左值引用作为参数的函数(除非类型通过类层次结构相关),也不能使用右值作为参数调用它。


推荐阅读