1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
1

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

11.08.2014, 03:24. Показов 3872. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Наткнулся тут в гугле на одну интересную тему.
Как известно, данный код не соответствует стандарту, и не будет скомпилирован многими современными компиляторами:

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());
}
Собственно, вопрос: почему он валиден?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2014, 03:24
Ответы с готовыми решениями:

Не создаётся ссылка на временный объект
Что же делать? Код: #include <iostream> using namespace std; class BigClass { public:

Временный объект
Требуется создать при помощи конструктора временный объект. Затем присвоить временный объект...

Временный объект и конструктор копирования
Добрый день! Столкнулся c задачкой в тесте: class A{ public: A(){ ...

Возвращение const ссылки на временный объект
Добрый вечер, #include <iostream> using namespace std; struct Point { int _x; int _y; };

24
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
11.08.2014, 21:51 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Все это хорошо, только не понятно к чему ты это написал. Никаких откровений я тут не увидел.
Я честно пытался угадать что ты имел в виду, но что-то не выходит. Поясни.
C++
1
2
С & c = C(); // <-- Этот временный объект будет уничтожен тогда, когда изничтожится ссылка(только, наверное, стоит const C & сделать)
c.foo(); //поэтому здесь объект жив и ссылка не висячая.
Если что-то путаю, поправьте.
1
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
11.08.2014, 22:22 22
Цитата Сообщение от Croessmah Посмотреть сообщение
Если что-то путаю, поправьте.
Этот пример вообще не соберется на компиляторе, который соответствует стандарту. Если предположить, что он собирается, то, вероятно у него может быть такое же поведение, как в случае с const ссылкой (согласно тому пункту правил). Т.е. время жизни продлится. В этом смысле ты ничего не путаешь и абсолютно прав. Теперь я понял на что ты намекал.
Ладно, признаю, пример был не удачен.
Я думаю, гораздо более убедительно будет выглядеть аргументация запрета изменения временных объектов.
Скажем, в той же Visual Studio (в которой такое разрешено) делается разница между:
C++
1
2
int & a1 = int(2); // нельзя
Int & a2 = Int(2); // можно
а это добавляет исключений из правил в копилку С++. А запрет вносит хотя бы формальное единообразие.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.08.2014, 01:11  [ТС] 23
Не совсем понял если честно, при чем тут висячие ссылки. Вопрос был о временном объекте, о его законном времени жизни, и о использовании его в это время, то есть до точки с запятой.
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
12.08.2014, 01:38 24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Не совсем понял если честно, при чем тут висячие ссылки.
Ну "драка"-то уже состоялась
А висячие ссылки тут были как попытка объяснить запреты. Впрочем, не очень удачная.

Цитата Сообщение от Toshkarik Посмотреть сообщение
о его законном времени жизни, и о использовании его в это время, то есть до точки с запятой.
Законные времена жизни очень хорошо описаны в посте Croessmah со ссылкой на стандарт. Более лаконичного ответа быть не может. И там не всегда фигурирует точка с запятой.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.08.2014, 01:56  [ТС] 25
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну "драка"-то уже состоялась
Просто не была возможности отписаться раньше
0
12.08.2014, 01:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2014, 01:56
Помогаю со студенческими работами здесь

Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary...

Ссылка на объект класса
class Aclass{ public: int i=0; void j(){i=2;} }; Aclass f(){ Aclass w; ...

Ссылка на объект класса в массиве
Вообщем есть класс THypergraph в котором находятся два массива объектов класса TGraphObject: ...

Ссылка на объект, возвращаемый функцией
Безопасно ли подобное? typedef std::vector&lt; string &gt; vec; vec someFoo(); vec someBoo() { //...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru