我尝试了以下代码:
#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 现在请解释一下我在想错的地方?
答案 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);
}