c++ - 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 版本?非常感谢您的帮助:)
解决方案
您正在使用 type 的参数调用该函数int
,但该函数将引用 a long
or float
,它们是不同的类型,作为参数。您不能将一种类型的引用绑定到另一种类型(最多const
/volatile
限定符,如果它们不通过类层次结构相关)。
因此,编译器试图做的是创建一个参数类型的临时对象,该对象int
通过转换(算术转换)从参数初始化,并将引用绑定到该对象。
临时对象是右值,这意味着它们不能绑定到非const
左值引用。float
因此,从int
传递给它的对象创建对象后, foo
s 参数将无法绑定到它。因此,float
过载是不可行的。
剩下的唯一超载就是那个long
。这个是可行的,因为在创建临时long
对象之后,它可以绑定到一个const
左值引用。
所以long
版本被调用。
const
只有当参数和参数的类型匹配(最多)并且参数本身是左值时,您显示的报价才适用(大部分) 。我假设您错过了围绕引用部分的相关上下文。
您不能调用将const
具有不同类型的非左值引用作为参数的函数(除非类型通过类层次结构相关),也不能使用右值作为参数调用它。
推荐阅读
- exchange-server - 是否指定了消息引用的 id 的顺序?
- java - 无法导入 BaseGameActivity
- java - 当我尝试构建我的项目时,Jenkins 给了我“意外的元素”{}path“{antlib:org.apache.tools.ant}path”
- android - Xamarin 表单 Progressbar 方法 progressTo 在某些 Android 设备上不起作用
- node.js - 删除后的 SQLite 回调
- r - R中B样条基的导数
- css - 如何删除边框顶部半径 bg 透明度?
- javascript - req.user 是未定义的,即使它能够 console.log 用户
- c - 为什么在定义结构时使用不同的标识符?
- mysql - 从 MySQL 数据库中删除数百万行的最快方法是什么?