我想我从TC ++ PL那里学到了什么 “非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()的返回值显然不是左值。
答案 0 :(得分:4)
我认为,您使用Microsoft Visual C ++编译器,使用默认选项编译此代码。因为它有非标准的扩展,它允许绑定rvalues到左值引用。 有关如何在MSVC中工作的更多信息,请阅读rvalue to lvalue conversion Visual Studio
答案 1 :(得分:2)
这两个陈述都不起作用。原因是f(2)返回一个常量值,f(1)期望非常数,因此错误消息。
int f3(const string &s)
{
return 1;
}
int f1(const int &x)
{
return 1;
}
这将消除错误。
答案 2 :(得分:0)
从概念上讲,此代码不起作用。为什么呢?
答案:每个函数f1和f3都使用一个参数作为地址调用。所以它必须能够引用传递给它的参数的地址。因此,对函数f1和f3中参数值的任何更改都应该影响传递给它的实际变量。
但是函数f4和f2的返回值是常量,不能改变。因此错误。
现在,如果你需要做的就是将函数f2和f4的值传递给函数f1和f3,只需按值传递它们即可。要做到这一点,删除&amp;签到参数。
答案 3 :(得分:-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;
}