Передайте временный объект для функционирования, который берет указатель

Я попробовал следующий код:

#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.
Теперь объясните меня, где я думаю неправильно?

6
задан Happy Mittal 6 June 2010 в 19:32
поделиться

4 ответа

Унарный & принимает lvalue (или имя функции). Функция f1 () не возвращает lvalue, она возвращает rvalue (для функции, которая что-то возвращает, если она не возвращает ссылку, ее возвращаемое значение - rvalue), поэтому унарный & не может быть применен к нему.

6
ответ дан 9 December 2019 в 22:29
поделиться

Ваша программа не компилируется, потому что f1 имеет параметр, а вы его не передаете.

Кроме того, значение, возвращаемое функцией, является r-значением, вы не можете получить его адрес.

1
ответ дан 9 December 2019 в 22:29
поделиться

Попробуйте так:

int main()
{
    string str;
    string str2 = f1(str); // copy the temporary
    f2(&str2);
}
0
ответ дан 9 December 2019 в 22:29
поделиться

Можно создать (и передать) указатель на временный объект, если вы знаете, что делаете. Однако делать это нужно иначе.

Функция с возвращаемым значением не ссылочного типа возвращает rvalue . В C ++ применение встроенного унарного оператора & к rvalue запрещено. Требуется lvalue.

Это означает, что если вы хотите получить указатель на ваш временный объект, вы должны сделать это каким-то другим способом. Например, как двухстрочная последовательность

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

, которая также может быть свернута в одну строку с помощью преобразования

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

. В обоих случаях, описанных выше, функция f2 должна принимать константную строку * параметр. Просто строка * , как в вашем случае, не будет работать, если вы не откажетесь от константности из аргумента (что, кстати, сделает все это еще более уродливым, чем оно есть). Хотя, если мне не изменяет память, в обоих случаях нет гарантии, что ссылка будет прикреплена к временному оригиналу, а не к копии.

Просто имейте в виду, что создание указателей на временные объекты - довольно сомнительная практика, потому что очевидные проблемы со временем жизни. Обычно вам следует избегать этого.

4
ответ дан 9 December 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: