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

Ссылки на временные объекты - C++

Восстановить пароль Регистрация
 
Alexey104
 Аватар для Alexey104
0 / 0 / 0
Регистрация: 26.10.2014
Сообщений: 89
13.07.2015, 21:37     Ссылки на временные объекты #1
Здравствуйте!
В процессе экспериментов с С++ появились некоторые непонятки. Рассмотрим код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
int& Func() {int a = 104; return a;}
 
int main()
{
  int c = Func();
  cout << c << "\n";
  return 0;
}
Ясен пень, данный код компилятор не хавает, поскольку в строке 5 производится попытка возврата из функции ссылки на локальную(временную) переменную этой функции. Я себе это представляю так:
Если бы компилятор позволил откомпилировать данный код, в строке 9 произошёл бы вызов функции, внутри которой была бы создана локальная переменная 'a'. Далее ссылка на эту переменную была бы возвращена из функции, а сама переменная после этого сразу была бы уничтожена. Затем в этой же строке произошла бы попытка инициализировать переменную 'c' ссылкой на уже не существующую переменную 'a'. Чтобы это предотвратить, компилятор уведомляет об ошибке.

Но прикол в том, что если строку 5 изменить следующим образом:
C++
1
int& Func() {int a = 104; int &b = a; return b;}
,
то код мало того, что компилируется, так ещё и корректно выполняется(строка 10 выводит на экран значение '104'). Никак не могу врубиться почему. Ведь, как и в первом случае, функция возвращает ссылку на временный объект. Может, компилятор не может "заглянуть" внутрь ссылки 'b' и увидеть, что она указывает на локальную переменную функции, поэтому и позволяет вернуть эту ссылку из функции? Но как же тогда переменная 'c' в строке 9 инициализируется этой ссылкой, если после её возврата(ссылки) из функции переменная 'a', на которую она указывает уничтожается?

Никто не прояснит ситуацию?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 21:37     Ссылки на временные объекты
Посмотрите здесь:

C++ Теория, Временные объекты
C++ Временные диалоги Win32 API
C++ Как правильно массиву объектов присвоить ссылки на объекты.
C++ Ссылки на объекты в функции с не заданным типом переменных
C++ "Анонимные" (временные) объекты?
C++ В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
C++ Временные объекты встроенного типа

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.07.2015, 21:49     Ссылки на временные объекты #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Alexey104 Посмотреть сообщение
так ещё и корректно выполняется
это из-за полнолуния этот код приведет к UB
Цитата Сообщение от Alexey104 Посмотреть сообщение
то код мало того, что компилируется
ну так b же ссылка, а на что она там "нацелена", это уже никто проверять не будет.

Добавлено через 1 минуту
Цитата Сообщение от Alexey104 Посмотреть сообщение
Ведь, как и в первом случае, функция возвращает ссылку на временный объект.
на локальную переменную, которая будет уничтожена после выхода из функции

Добавлено через 1 минуту
Цитата Сообщение от Alexey104 Посмотреть сообщение
Но как же тогда переменная 'c' в строке 9 инициализируется этой ссылкой, если после её возврата(ссылки) из функции переменная 'a', на которую она указывает уничтожается?
ну так "сама ссылка" то остается, и "ссылается" туда же, просто там уже может быть что-то другое
Alexey104
 Аватар для Alexey104
0 / 0 / 0
Регистрация: 26.10.2014
Сообщений: 89
13.07.2015, 21:58  [ТС]     Ссылки на временные объекты #3
Спасибо, понятно!
Yandex
Объявления
13.07.2015, 21:58     Ссылки на временные объекты
Ответ Создать тему
Опции темы

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