c++中暫時變量不能作為非const的援用參數的辦法。本站提示廣大學習愛好者:(c++中暫時變量不能作為非const的援用參數的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是c++中暫時變量不能作為非const的援用參數的辦法正文
試看上面的代碼:
#include <iostream>
using namespace std;
void f(int &a)
{
cout << "f(" << a << ") is being called" << endl;
}
void g(const int &a)
{
cout << "g(" << a << ") is being called" << endl;
}
int main()
{
int a = 3, b = 4;
f(a + b); //編譯錯誤,把暫時變量作為非const的援用參數傳遞了
g(a + b); //OK,把暫時變量作為const&傳遞是允許的
}
下面的兩個調用之前,a+b的值會存在一個暫時變量中,當把這個暫時變量傳給f時,由於f的聲明中,參數是int&,不是常量援用,所以發生以下編譯錯誤:
const_ref.cpp: In function `int main()':
const_ref.cpp:14: error: invalid initialization of non-const reference of type '
int&' from a temporary of type 'int'
const_ref.cpp:4: error: in passing argument 1 of `void f(int&)' 而在g(a+b)中,由於g定義的參數是const int&,編譯經過。 問題是為什麼暫時變量作為援用參數傳遞時,必需是常量援用呢?很多人對此的解釋是暫時變量是常量,不允許賦值,改動,所以當作為十分量援用傳遞時,編譯器就會報錯。這個解釋在關於了解暫時變量不能作為非const援用參數這個問題上是可以的,但不夠精確。現實上,暫時變量是可以被作為左值(LValue)並被賦值的,請看上面的代碼:
#include <iostream>
using namespace std;
class CComplex {
friend CComplex operator+(const CComplex &cp1, const CComplex &cp2);
friend ostream& operator<<(ostream &os, const CComplex &cp);
private:
int x;
public:
CComplex(){}
CComplex(int x1) {
x = x1;
}
};
CComplex operator+(const CComplex &cp1, const CComplex &cp2)
{
CComplex cp3;
cp3.x = cp1.x + cp2.x;
return cp3;
} ostream& operator<<(ostream &os, const CComplex &cp)
{
os << cp.x;
return os;
}
int main()
{
CComplex a(2), b(3), c(4);
cout << (a + b) << endl;
cout << ((a + b) = c) << endl; //暫時對象作為左值
return 0;
}
下面的順序編譯經過,而且運轉後果是:
5
4
暫時變量的確被賦值,而且成功了。
所以,暫時變量不能作為非const援用參數,不是由於他是常量,而是由於c++編譯器的一個關於語義的限制。假如一個參數是以非const援用傳入,c++編譯器就有理由以為順序員會在函數中修正這個值,並且這個被修正的援用在函數前往後要發揚作用。但假如你把一個暫時變量當作非const援用參數傳出去,由於暫時變量的特殊性,順序員並不能操作暫時變量,而且暫時變量隨時能夠被釋放掉,所以,普通說來,修正一個暫時變量是毫有意義的,據此,c++編譯器參加了暫時變量不能作為非const援用的這個語義限制,意在限制這個十分規用法的潛在錯誤。
還不明白?OK,我們說直白一點,假如你把暫時變量作為非const援用參數傳遞,一方面,在函數聲明中,運用十分量型的援用通知編譯器你需求失掉函數對某個對象的修正後果,可是你自己又不給變量起名字,直接丟棄了函數的修正後果,編譯器只能說:“大哥,你這是干啥呢,通知我把後果給你,等我把後果給你了,你又直接給扔了,你這不是在玩我呢嗎?”所以編譯器一怒之下就不讓過了。這下大家明白了吧?
以上這篇c++中暫時變量不能作為非const的援用參數的辦法就是分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。