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

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

05.08.2015, 20:11. Просмотров 329. Ответов 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);

http://www.cyberforum.ru/cpp-beginners/thread2041941.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2015, 20:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция возвращает константную ссылку (C++):

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

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

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

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

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

6
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
05.08.2015, 20:42 #5
Цитата Сообщение от Croessmah Посмотреть сообщение
функции это представляло опасность
Какую? Приняты две переменные по ссылке и возвращается одна из них. Копирования и создания локальной переменной нигде нет. Что же не так?
Цитата Сообщение от IVSasha Посмотреть сообщение
И вызываю функцию
Max<double>(5, 4.2);
не должно скомпилироваться. если ожидается ссылка то нужно передать ссылку, а не литеральную константу. Нет у неё адреса.
1
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

Функция не возвращает значение
Функция ничего не возвращает: int Return(int s) { return s; } Передаю...

Функция не возвращает значение
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...


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

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

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