以前一直不明白一个问题,比如当声明
void init(const string & a,int b)
在调用的时候可以这样
string s="This is a practice";
int num=9;
init(s,9);
我一直认为第一个参数必须接收一个string类型的引用才行.后来今天看到别人的文章才知道为什么,原来是这样的,系统帮我们做了一个临时变量,其实暗含一个隐式转换:
*********以下引用
http://www.cppblog.com/rosinahua/archive/2007/01/15/17632.html的内容*********
当引用的初始式是一个左值(是一个对象,你可以取得他的地址)时,其初始化就是非常简单的事情。普通T&的初始式必须是一个T类型的。而cosnt T&则不必是一个左值,甚至可以不是T类型的。在这样的情况下,经过以下几个步骤。
(1)首先,如果需要的话,将应用到类型T的隐式类型转换。
(2)而后,将结果存入一个类型T的临时变量。
(3)最后,将此临时变量用作初始化的值。
例如
double& d=1; //错误,初始式必须式左值
const double& cd=1; //ok
对后一个初始化的解释是:
double temp=double(1); // 首先建立一个具有正确数据类型的临时变量
const double& cd=temp; //而后用这个临时变量作为cd的初始式