2013-04-24 83 views
3

我想我從TC++ PL中學習到 「一個非const引用應該用左值初始化」。非const引用的初始化

而下面是我的問題

int f1(int &x) 
{ 
    return 1; 
} 

int f2() 
{ 
    return 1; 
} 

int f3(string &s) 
{ 
    return 1; 
} 

string f4() 
{ 
    return "1"; 
} 

int main() 
{ 
    cout<<f1(f2())<<endl; // Error. 
    cout<<f3(f4())<<endl; // OK. 
} 

所以我上無法明白,爲什麼F3(F4())是正確的,而F4()的返回值是明顯不是一個左值。

+3

它不應該工作。你用什麼編譯器? – ForEveR 2013-04-24 11:03:17

+1

不適合我,因爲我期待。 – soon 2013-04-24 11:03:21

+0

我編譯VS2010中的代碼。 – hwlts 2013-04-24 11:24:21

回答

4

我想,你使用Microsoft Visual C++編譯器,使用默認選項編譯此代碼。這是因爲它有非標準的擴展,允許綁定rvalue左值引用。 欲瞭解更多信息,有關如何可以在MSVC這項工作,你可以閱讀rvalue to lvalue conversion Visual Studio

+0

接受。謝謝你。 – hwlts 2013-04-24 11:42:40

2

這兩個聲明都不起作用。原因是f(2)返回一個常數值,f(1)期望一個非常數因此是錯誤信息。

int f3(const string &s) 
{ 
    return 1; 
} 

int f1(const int &x) 
{ 
    return 1; 
} 

這將消除錯誤。

0

從概念上說,這段代碼不應該工作。爲什麼?

答:每個函數f1和f3都使用一個參數作爲按地址調用。所以它必須能夠引用傳遞給它的參數的地址。因此,函數f1和f3中參數值的任何改變都會影響傳遞給它的實際變量。

但函數f4和f2的返回值是常量,不能改變。因此錯誤。

現在,如果您只需要將函數f2和f4的值傳遞給函數f1和f3,只需傳遞值即可。爲此,請刪除參數中的&標誌。

+0

爲什麼f1將參數作爲「按地址呼叫」?它只是參考作爲參數 – Subhajit 2013-04-24 11:25:25

+0

@Subhajit如果你注意到,這個**(int&x)**,它是一個通過引用/地址的調用。但如果你這樣做**(int x)**,這是一個按值調用。現在你可以傳遞另一個變量或一個常數值。希望這是明確 – itsols 2013-04-24 11:27:44

-1
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout<<f1(f2())<<endl; 
    int &a(1); //This is what gonna happen when your f2() returns 1 and 1 is passed in f1(int&). That is invalid. 
     cout<<f3(f4())<<endl; 
    // string& str(string("1"));//when "1" is returned from f4() it will be implicitly casted to string("1") and pass in f3 as f3(string("1")). There it comes valid reference. 


    return 0; 
} 
+0

「_這是當你的f2()返回1_會發生什麼 - 」 - 什麼? 'f2()'返回_prvalue_,它如何被引用來引用? – soon 2013-04-24 11:35:30

+1

是的,它不能被引用,因此它顯示錯誤。 – kalpesh 2013-04-24 11:40:32

+0

對不起,這是我的錯。但你告訴:「_它有效的參考_」爲第二種情況。這是否意味着,'string&str(string(「1」));'是有效的,或者我錯過了某些東西(再次> _ <)? – soon 2013-04-24 11:48:01