c 中臨時變數不能作為非const的引用引數

2021-09-30 03:13:54 字數 1433 閱讀 3815

引自:

試看下面的**:

#include

using namespace std;

void f(int &a)

void g(const int &a)

int main()

上面的兩個呼叫之前,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  

using namespace std;

class ccomplex

ccomplex(int x1)

};ccomplex operator+(const ccomplex &cp1, const ccomplex &cp2)

ostream& operator<<(ostream &os, const ccomplex &cp)

int main()

上面的程式編譯通過,而且執行結果是:

5臨時變數確實被賦值,而且成功了。

所以,臨時變數不能作為非const引用引數,不是因為他是常量,而是因為c++編譯器的乙個關於語義的限制。如果乙個引數是以非const引用傳入,c++編譯器就有理由認為程式設計師會在函式中修改這個值,並且這個被修改的引用在函式返回後要發揮作用。但如果你把乙個臨時變數當作非const引用引數傳進來,由於臨時變數的特殊性,程式設計師並不能操作臨時變數,而且臨時變數隨時可能被釋放掉,所以,一般說來,修改乙個臨時變數是毫無意義的,據此,c++編譯器加入了臨時變數不能作為非const引用的這個語義限制,意在限制這個非常規用法的潛在錯誤。

還不明白?ok,我們說直白一點,如果你把臨時變數作為非const引用引數傳遞,一方面,在函式申明中,使用非常量型的引用告訴編譯器你需要得到函式對某個物件的修改結果,可是你自己又不給變數起名字,直接丟棄了函式的修改結果,編譯器只能說:「大哥,你這是幹啥呢,告訴我把結果給你,等我把結果給你了,你又直接給扔了,你這不是在玩我呢嗎?」所以編譯器一怒之下就不讓過了。這下大家明白了吧?

c 中不能返回臨時變數的引用或者指標的問題

例1 int f int main 在例1的程式中,由於f 函式返回的是int型別,在函式結束時,要返回的值已經用於初始化函式的呼叫點的臨時量了 假設為temp,在main 呼叫者 中 函式執行完後,i確實是被銷毀了,但是temp還沒有被銷毀。int r f 語句相當於執行 int r temp 例...

C 中無處不在的臨時變數

概念 定義 分配記憶體,初始化操作是可選的。如未初始化則記憶體是未定義的 宣告 這裡指狹義的宣告。不分配記憶體,只是為了方便編譯器 初始化 已經新建立了物件 已分配記憶體 用乙個已經存在的物件對它進行初始化,即給它占有的記憶體填充值。c 中初始化有兩種形式 1 對於內建型別,通過 操作符進行初始化,...

stl中string作為成員變數引起的core問題

在使用stl的string的過程中,遇到了乙個會引起core的問題,具體的問題 如下 include include 該程式是為測試stl的string在某種情況下,發生了core 當建構函式的寫法為寫法一的情況,程式發生了core 測試環境為 linux mengpl virtual machin...