非const引用的初始化

时间:2013-04-24 11:00:37

标签: c++ reference initialization

我想我从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()的返回值显然不是左值。

4 个答案:

答案 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;
}