Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
IVSasha
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
1

Функция возвращает константную ссылку

05.08.2015, 20:11. Просмотров 842. Ответов 6
Метки нет (Все метки)

Можно ли в таком случае возвращать константную ссылку? Не будет никакой опасности?
Ведь в функции вроде создается временный объект double 5.0

C++
1
2
3
4
5
6
7
template <typename T_Return, typename T1, typename T2>
T_Return const& Max(T1 const &a, T2 const &b)
{
    return a > b ? a : b;
}
 
Max<double>(5, 4.2);
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2015, 20:11
Ответы с готовыми решениями:

Функция возвращает ссылку
Вот пример программы какой смысл здесь возвращать ссылку? И вообще не могу...

Функция возвращает ссылку на статический массив
Мне необходимо чтобы массив pol и mas были обязательно статическими, но...

Функция возвращает не ссылку а само значение переменной на которое оно ссылается
Скажите пожалуйста есть функция `int&amp; my(){return a} которая возвращает ссылку...

Функция - принять ссылку вернуть ссылку
В одной из тем я интересовался записью типа int &amp; fun (int rhs), что она значит...

Почему оператор сложения двух временных объектов возвращает lvalue ссылку?
Допустим есть класс: class A { public: A() {} A(const A&amp;) { cout &lt;&lt;...

6
Croessmah
++Ͻ
14626 / 8377 / 1580
Регистрация: 27.09.2012
Сообщений: 20,579
Записей в блоге: 2
Завершенные тесты: 1
05.08.2015, 20:13 2
Цитата Сообщение от IVSasha Посмотреть сообщение
Не будет никакой опасности?
Даже без временного объекта в функции это представляло опасность
2
IVSasha
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
05.08.2015, 20:30  [ТС] 3
Понятно. Ссылку не буду возвращать

Теперь возвращаю переменную

C++
1
2
3
4
5
template <typename T_Return, typename T1, typename T2>
T_Return Max(T1 const &a, T2 const &b)
{
    return a > b ? a : b;
}
И вызываю функцию
Max<double>(5, 4.2);

Где здесь опасность?

Добавлено через 11 минут
возвращается переменная a. a - это константная ссылка. может из-за этого?
0
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
05.08.2015, 20:40 4
убери ссылки в обоих арг-ах т.к. вызов
C++
1
Max<double>(5 + 2, 4.2);
будет некорректным
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7057 / 3359 / 455
Регистрация: 04.12.2011
Сообщений: 9,345
Записей в блоге: 5
05.08.2015, 20:42 5
Цитата Сообщение от Croessmah Посмотреть сообщение
функции это представляло опасность
Какую? Приняты две переменные по ссылке и возвращается одна из них. Копирования и создания локальной переменной нигде нет. Что же не так?
Цитата Сообщение от IVSasha Посмотреть сообщение
И вызываю функцию
Max<double>(5, 4.2);
не должно скомпилироваться. если ожидается ссылка то нужно передать ссылку, а не литеральную константу. Нет у неё адреса.
1
DrOffset
8143 / 4723 / 1155
Регистрация: 30.01.2014
Сообщений: 7,695
05.08.2015, 21:43 6
Лучший ответ Сообщение было отмечено IVSasha как решение

Решение

Цитата Сообщение от IGPIGP Посмотреть сообщение
Что же не так?
Аргументы разных типов. Значит при возврате будет создан временный объект посредством приведения.
А вариант без временного объекта опасен, например, следующим образом:
C++
1
2
3
double const & r = Max<double>(5.2, 4.2);
//....
std::cout << r << std::endl; // висячая ссылка, на уничтоженные данные
Цитата Сообщение от IGPIGP Посмотреть сообщение
не должно скомпилироваться. если ожидается ссылка то нужно передать ссылку, а не литеральную константу. Нет у неё адреса.
Все тут нормально. У литерной константы адреса нет, зато он есть у временного rvalue объекта, который ей проинициализируется в таком коде.

Добавлено через 2 минуты
Да, забыл. Читать в срочном порядке: http://herbsutter.com/2008/01/01/got...portant-const/
Ссылка на русский краткий пересказ: http://alenacpp.blogspot.ru/2008/01/const.html
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7057 / 3359 / 455
Регистрация: 04.12.2011
Сообщений: 9,345
Записей в блоге: 5
05.08.2015, 22:23 7
Цитата Сообщение от DrOffset Посмотреть сообщение
Аргументы разных типов.
верно!
Ушёл читать.
0
05.08.2015, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2015, 22:23

Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива
Задача: Первое решение учитильница не принила. Сказала что все не...

Указатель на константную текстовую строку
С точки зрения стандарта это валидный код? int main() { char* pproverb{...

Использование указателя на константную строку
Здравствуйте. Почему так char* kk = &quot;345345&quot;; kk = 0x00; компилятор...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru