将临时对象传递给带指针的函数

时间:2010-06-06 19:21:33

标签: c++ function temporary

我尝试了以下代码:

#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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

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

这意味着,如果要获取指向临时对象的指针,则必须以其他方式执行此操作。例如,作为两行序列

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

也可以使用演员

折叠成一行
f2(&(const string &) f1(str));

在上述两种情况下,f2函数都应接受const string *参数。在你的情况下只是一个string *将不起作用,除非你从参数中抛弃constness(BTW,将使整个事情比现在更加丑陋)。虽然,如果记忆为我服务,在这两种情况下都不能保证引用附加到原始临时而不是副本。

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

答案 2 :(得分:1)

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

此外,函数返回的值是rvalue,您不能获取其地址。

答案 3 :(得分:0)

试试这个:

int main()
{
    string str;
    string str2 = f1(str); // copy the temporary
    f2(&str2);
}