先看下面這段代碼:ios
int incr(int& val){ return ++val; } int main(){ short v1=1; const int v2=10; int v3=20; incr(v1); //錯誤:v1不是int incr(v2); //錯誤:v2是const incr(v3); //正確 incr(10); //引用類型的參數不能是常量 }
調用非const類型的引用形參,實參必須是非const類型的,並且實參的類型和形參的類型必須徹底相同。注意這裏是徹底相同,short也不能代替int,int也不能代替short.ide
當調用一個const引用的形參函數時,若是實參不是一個變量或者該類型不匹配,函數會建立一個無名的臨時變量用來存儲實參的值,並把這個形參做爲該臨時變量的引用。示例代碼以下:函數
#include<iostream> using namespace std; double refcube(const double &ra); int main(){ double side1=12.0; int side2=6; double c5=refcube(side2); //實參和形參不匹配,可是能夠轉換成正確的類型。 cout<<c5<<endl; double c6=refcube(7.0); //實參和形參匹配,可是不是左值。 cout<<c6<<endl; double c7=refcube(side1+10.0); //實參和形參匹配,但不是左值。 cout<<c7<<endl; double c8=refcube(side2+4); //實參和形參不匹配,可是能夠轉換成正確的類型,並且不是左值。 cout<<c8<<endl; } double refcube(const double& ra){ return ra*ra*ra; }
注意:這種生成臨時變量必須是要以const引用爲前提,若是函數爲double refcube(double&ra),則上述程序沒法運行。spa