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

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

Восстановить пароль Регистрация
 
 
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.08.2014, 03:24     Ссылка на временный объект #1
Наткнулся тут в гугле на одну интересную тему.
Как известно, данный код не соответствует стандарту, и не будет скомпилирован многими современными компиляторами:

C++
1
2
3
4
5
6
7
8
9
10
11
class A {
 
};
 
void f( A & ) {
   
}
 
int main() {
   f( A());
}
Но данный код компилируется, и вполне валиден:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
public:
   A &getThis() {
      return *this;
   }
};
 
void f( A & ) {
   
}
 
int main() {
   f( A().getThis());
}
Собственно, вопрос: почему он валиден?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
11.08.2014, 21:51     Ссылка на временный объект #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Все это хорошо, только не понятно к чему ты это написал. Никаких откровений я тут не увидел.
Я честно пытался угадать что ты имел в виду, но что-то не выходит. Поясни.
C++
1
2
С & c = C(); // <-- Этот временный объект будет уничтожен тогда, когда изничтожится ссылка(только, наверное, стоит const C & сделать)
c.foo(); //поэтому здесь объект жив и ссылка не висячая.
Если что-то путаю, поправьте.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
11.08.2014, 22:22     Ссылка на временный объект #22
Цитата Сообщение от Croessmah Посмотреть сообщение
Если что-то путаю, поправьте.
Этот пример вообще не соберется на компиляторе, который соответствует стандарту. Если предположить, что он собирается, то, вероятно у него может быть такое же поведение, как в случае с const ссылкой (согласно тому пункту правил). Т.е. время жизни продлится. В этом смысле ты ничего не путаешь и абсолютно прав. Теперь я понял на что ты намекал.
Ладно, признаю, пример был не удачен.
Я думаю, гораздо более убедительно будет выглядеть аргументация запрета изменения временных объектов.
Скажем, в той же Visual Studio (в которой такое разрешено) делается разница между:
C++
1
2
int & a1 = int(2); // нельзя
Int & a2 = Int(2); // можно
а это добавляет исключений из правил в копилку С++. А запрет вносит хотя бы формальное единообразие.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2014, 01:11  [ТС]     Ссылка на временный объект #23
Не совсем понял если честно, при чем тут висячие ссылки. Вопрос был о временном объекте, о его законном времени жизни, и о использовании его в это время, то есть до точки с запятой.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
12.08.2014, 01:38     Ссылка на временный объект #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Не совсем понял если честно, при чем тут висячие ссылки.
Ну "драка"-то уже состоялась
А висячие ссылки тут были как попытка объяснить запреты. Впрочем, не очень удачная.

Цитата Сообщение от Toshkarik Посмотреть сообщение
о его законном времени жизни, и о использовании его в это время, то есть до точки с запятой.
Законные времена жизни очень хорошо описаны в посте Croessmah со ссылкой на стандарт. Более лаконичного ответа быть не может. И там не всегда фигурирует точка с запятой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 01:56     Ссылка на временный объект
Еще ссылки по теме:

Ссылка на объект, возвращаемый функцией C++
Может ли объект-член, или объект-элемент достучаться к содержащему его? C++
C++ Ссылка на объект класса

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2014, 01:56  [ТС]     Ссылка на временный объект #25
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну "драка"-то уже состоялась
Просто не была возможности отписаться раньше
Yandex
Объявления
12.08.2014, 01:56     Ссылка на временный объект
Ответ Создать тему
Опции темы

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