3

我想我从 TC++PL 中了解到“非常量引用应该由左值初始化”。

以下是我的问题

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

4 回答 4

4

我认为,您使用 Microsoft Visual C++ 编译器,使用默认选项编译此代码。这是因为其中有非标准扩展,允许将右值绑定到左值引用。有关如何在 MSVC 中工作的更多信息,您可以阅读右值到左值转换 Visual Studio

于 2013-04-24T11:12:46.367 回答
2

这两种说法都行不通。原因是 f(2) 返回一个常量值,而 f(1) 需要一个非常量,因此会出现错误消息。

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

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

这将消除错误。

于 2013-04-24T11:12:38.273 回答
0

从概念上讲,这段代码不应该工作。为什么?

答:函数 f1 和 f3 中的每一个都使用一个参数作为按地址调用。所以它必须能够引用传递给它的参数的地址。因此,函数 f1 和 f3 中参数值的任何更改都会影响传递给它的实际变量。

但函数 f4 和 f2 的返回值是常量,不能更改。因此错误。

现在,如果您只需将函数 f2 和 f4 的值传递给函数 f1 和 f3,只需按值传递即可。为此,请删除参数中的 & 符号。

于 2013-04-24T11:20:13.680 回答
-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;
}
于 2013-04-24T11:25:46.230 回答