Я попробовал следующий код:
#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.
Теперь объясните меня, где я думаю неправильно?
Унарный &
принимает lvalue (или имя функции). Функция f1 ()
не возвращает lvalue, она возвращает rvalue (для функции, которая что-то возвращает, если она не возвращает ссылку, ее возвращаемое значение - rvalue), поэтому унарный &
не может быть применен к нему.
Ваша программа не компилируется, потому что f1
имеет параметр, а вы его не передаете.
Кроме того, значение, возвращаемое функцией, является r-значением, вы не можете получить его адрес.
Попробуйте так:
int main()
{
string str;
string str2 = f1(str); // copy the temporary
f2(&str2);
}
Можно создать (и передать) указатель на временный объект, если вы знаете, что делаете. Однако делать это нужно иначе.
Функция с возвращаемым значением не ссылочного типа возвращает rvalue . В C ++ применение встроенного унарного оператора &
к rvalue запрещено. Требуется lvalue.
Это означает, что если вы хотите получить указатель на ваш временный объект, вы должны сделать это каким-то другим способом. Например, как двухстрочная последовательность
const string &r = f1(str);
f2(&r);
, которая также может быть свернута в одну строку с помощью преобразования
f2(&(const string &) f1(str));
. В обоих случаях, описанных выше, функция f2
должна принимать константную строку *
параметр. Просто строка *
, как в вашем случае, не будет работать, если вы не откажетесь от константности из аргумента (что, кстати, сделает все это еще более уродливым, чем оно есть). Хотя, если мне не изменяет память, в обоих случаях нет гарантии, что ссылка будет прикреплена к временному оригиналу, а не к копии.
Просто имейте в виду, что создание указателей на временные объекты - довольно сомнительная практика, потому что очевидные проблемы со временем жизни. Обычно вам следует избегать этого.