7

我尝试了以下代码:

#include<iostream> 
#include<string>
using namespace std;

string f1(string s)
{
   return s="f1 called";
}

void f2(string *s)
{
   cout<<*s<<endl;
}

int main()
{
   string str;
   f2(&f1(str));
}

但是这段代码无法编译。
我的想法是:f1 按值返回,因此它创建了临时的,我正在获取地址并将其传递给 f2。
现在请解释我在哪里想错了?

4

4 回答 4

7

一元&采用左值(或函数名)。函数f1()不返回左值,它返回一个右值(对于返回某些东西的函数,除非它返回一个引用,否则它的返回值是一个右值),所以一元&不能应用于它。

于 2010-06-06T19:25:12.587 回答
5

假设您知道自己在做什么,则可以创建(并传递)指向临时对象的指针。但是,应该以不同的方式进行。

具有非引用类型返回值的函数返回一个右值&在 C++ 中,禁止将内置的一元运算符应用于右值。它需要一个左值。

这意味着,如果您想获得指向临时对象的指针,则必须以其他方式进行。例如,作为两行序列

const string &r = f1(str);
f2(&r);

也可以通过使用铸件折叠成单行

f2(&(const string &) f1(str));

在上述两种情况下,f2函数都应该接受一个const string *参数。就像string *您的情况一样,除非您从论点中摒弃 constness (顺便说一句,这将使整个事情变得比现在更丑陋),否则就像您的情况一样是行不通的。虽然,如果我没记错的话,在这两种情况下都不能保证引用附加到原始临时文件而不是副本。

请记住,尽管创建指向临时对象的指针是一种相当可疑的做法,因为如果存在明显的生命周期问题。通常你应该避免这样做。

于 2010-06-06T20:29:41.723 回答
1

您的程序无法编译,因为f1有一个参数并且您没有传递任何参数。

此外,从函数返回的值是一个右值,你不能获取它的地址。

于 2010-06-06T19:23:42.340 回答
0

尝试这个:

int main()
{
    string str;
    string str2 = f1(str); // copy the temporary
    f2(&str2);
}
于 2010-06-06T19:45:45.270 回答