2013-04-24 95 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