Intereting Posts
boost :: program_options: параметры с фиксированным и переменным токеном? Получение указателя на конец массива Можно ли перегрузить перегруженный метод в std :: thread Использовать const везде, где это возможно, в C ++? получение указателя виртуальной таблицы c ++ C ++ 11: «сужение преобразования внутри {}» с модулем Почему в локальных classах допускаются не статические члены данных? Почему class не может иметь одно и то же имя для функции и элемента данных? Почему простой деструктор не удаляет производный объект, если он объявлен с использованием базового указателя Lock Free Queue – Single Producer, несколько потребителей Как предопределить (зарезервировать) priority_queue ? Повысить параллельное поведение МСМ с задержанными самопереходами? Создайте boost :: shared_ptr для существующей переменной Определение типа шаблона при доступе к элементам OpenCV Mat QML ComboBox item Стиль DropDownMenu

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

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

#include #include 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), поэтому unary & не может быть применено к ней.

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

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

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

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

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

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

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

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

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

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

Попробуй это:

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