Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Ссылка на объект, возвращаемый функцией - C++

01.03.2014, 16:41. Просмотров 341. Ответов 6
Метки нет (Все метки)

Безопасно ли подобное?
C++
1
2
3
4
5
6
7
8
9
typedef std::vector< string > vec;
vec someFoo();
vec someBoo()
{
// что-то делаем
vec & x = someFoo();
// что-то делаем с вектором 'x', удаляем некоторые элементы
return x;
}
Таким способом я хотел вместо того, чтобы создавать объект трижды, создавать его хотя бы дважды (по возвращении из someFoo и из someBoo), однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 16:41     Ссылка на объект, возвращаемый функцией
Посмотрите здесь:

Ссылка на объект не указывает на экземпляр объекта C++ C++
C++ Старик Хоттабыч, хочу, что бы результат возвращаемый функцией не стакался...
C++ Функции, возвращаемый тип
Что вернуть по ссылке, если объект функцией поиска не найден? C++
Анонимный объект по аналогии с анонимной функцией (lambda) C++
C++ Ссылка на объект класса
Ссылка на временный объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
01.03.2014, 17:06     Ссылка на объект, возвращаемый функцией #2
Чтобы не париться по таким вопросам, используйте С++11, где есть move-семантика.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
01.03.2014, 17:22     Ссылка на объект, возвращаемый функцией #3
Цитата Сообщение от nexen Посмотреть сообщение
однако не уверен, можно ли получать доступ к возвращаемому функцией объекту по ссылке
По константной можно. Или используй с++11, с его rvalue-reference.

А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
C++
1
2
3
4
void foo(vec & val)
{
    // здесь заполняем val
}
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.03.2014, 17:27     Ссылка на объект, возвращаемый функцией #4
Цитата Сообщение от DrOffset Посмотреть сообщение
А вообще, классически, задачу возвращения тяжелых объектов решают через out-параметры.
так есть же еще и RVO всякие.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
01.03.2014, 17:35     Ссылка на объект, возвращаемый функцией #5
Цитата Сообщение от Tulosba Посмотреть сообщение
так есть же еще и RVO всякие.
Да, но надо знать когда на них можно рассчитывать, а когда нет. Дам ТСу ссылку
nexen, RVO на wiki.
У Алёны С++.
Развернуто в MSDN.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.03.2014, 21:17  [ТС]     Ссылка на объект, возвращаемый функцией #6
DrOffset, насчет RVO я видел, но разве его можно использовать вручную? Разве это не оптимизация компилятора?
0x10, C++11 использовать не могу
DrOffset, а почему можно только по константной? В смысле, какова логика возвращаемого объекта от функции? Насколько мне известно, возвращаемых значений из функции (в виде return) на самом деле нет. Компилятор перегоняет возвращаемый объект в параметр, а дальше.. а дальше не знаю, посему и предположил, что на самом деле функции в примере идентичны для компилятора:
C++
1
2
3
4
5
6
string f1()
{ return "hello";}
void f2(string & result)
{
result = "";
}
А если они и правда идентичны, то значит (предполагал дальше), неявно создается объект локальный в месте вызова функции, в который записывается возвращаемое значение, а уже этот объект присваивается чему-то, т.е.:
C++
1
2
3
4
5
string out_f1 = f1();
// верхнее раскрывается в нижнее
string param;
f2(param);
string out_f2 = param;
И если это так, что почему именно константной должна быть ссылка на возвращаемый объект?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией
Еще ссылки по теме:

C++ Возвращаемый объект разрушается
C++ Ссылка на объект не указывает на экземпляр объекта
C++ Возвращаемый тип по умолчанию
Непонятный возвращаемый тип C++
Ссылка на объект как свойство класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nexen Посмотреть сообщение
Разве это не оптимизация компилятора?
Оптимизация, вручную ее использовать нельзя. На нее просто можно полагаться в опр. случаях.

Цитата Сообщение от nexen Посмотреть сообщение
DrOffset, а почему можно только по константной?
Потому что возвращаемое значение - это rvalue.

Цитата Сообщение от nexen Посмотреть сообщение
В смысле, какова логика возвращаемого объекта от функции?
Логика заключается в том, что в общем случае делается копия.

Цитата Сообщение от nexen Посмотреть сообщение
Насколько мне известно, возвращаемых значений из функции (в виде return) на самом деле нет. Компилятор перегоняет возвращаемый объект в параметр
Если мы будем рассуждать на этом уровне, то выяснится, что и параметров на самом деле нет. Есть стек и регистры. Но для понимания логики языка про это думать не обязательно.

Вам надо почитать про rvalue и lvalue.
Yandex
Объявления
01.03.2014, 21:25     Ссылка на объект, возвращаемый функцией
Ответ Создать тему
Опции темы

Текущее время: 03:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru