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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
#1

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

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

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

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());
}
Собственно, вопрос: почему он валиден?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2014, 03:24     Ссылка на временный объект
Посмотрите здесь:

Временный объект - C++
Требуется создать при помощи конструктора временный объект. Затем присвоить временный объект вызвавшему(представленному через this) функцию...

Временный объект и конструктор копирования - C++
Добрый день! Столкнулся c задачкой в тесте: class A{ public: A(){ cout<<"A()"<<endl; } A(const A& a){ ...

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

Ссылка на объект класса - C++
class Aclass{ public: int i=0; void j(){i=2;} }; Aclass f(){ Aclass w; sA&w; //Как правильно сделать...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.08.2014, 15:02  [ТС]     Ссылка на временный объект #16
Я уже не найду, наверно, статью, в которой показывались новшества C++11 и способы достижения некоторых из них в C++03( 98 ). Я ведь не настаиваю ни на чем. Просто хотелось бы понять "создателей" языка/стандартов. Если бы небыло хоть в чем то полезным, то я не нашел бы этого способа в интернете. Конечно, я понимаю, что экспериментаторов тоже хватает.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
11.08.2014, 15:38     Ссылка на временный объект #17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Просто хотелось бы понять "создателей" языка/стандартов.
Они не боги, а такие же люди. Не каждая возможность языка имеет глубокий смысл и кейс к применению, где иначе было бы нельзя.
"If you think C++ is not overly complicated, just what is a “protected abstract virtual base pure virtual private destructor,” and when was the last time you needed one?", - Tom Cargill (1990).
Цитата взята с седьмого слайда доклада: https://tech.yandex.ru/events/cpp-pa...sk/talks/1954/
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
11.08.2014, 18:11     Ссылка на временный объект #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Просто хотелось бы понять "создателей" языка/стандартов.
Защита в том числе от висячих ссылок. Уж больно просто их создать становится.
C++
1
2
С & c = C();
c.foo(); // fail
А так конечно любую защиту можно сломать, и если ты сейчас приведешь пяток способов создать висячую ссылку, то это не будет значить, что я не прав. А будет значить только лишь то, что нет в мире совершенных инструментов (наш мозг в том числе).
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,067
Записей в блоге: 3
Завершенные тесты: 1
11.08.2014, 21:08     Ссылка на временный объект #19
C++
1
2
С & c = C();
c.foo(); // fail
DrOffset, а как же:
There are two contexts in which temporaries are destroyed at a different point than the end of the full-expression. The first context is when a default constructor is called to initialize an element of an array. If the constructor has one or more default arguments, the destruction of every temporary created in a default argument is sequenced before the construction of the next array element, if any.


The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except:
— A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.
— A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full-expression containing the call.
— The lifetime of a temporary bound to the returned value in a function return statement (6.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.
— A temporary bound to a reference in a new-initializer (5.3.4) persists until the completion of the full-expression containing the new-initializer.

The destruction of a temporary whose lifetime is not extended by being bound to a reference is sequenced before the destruction of every temporary which is constructed earlier in the same full-expression. If the lifetime of two or more temporaries to which references are bound ends at the same point, these temporaries are destroyed at that point in the reverse order of the completion of their construction. In addition, the destruction of temporaries bound to references shall take into account the ordering of destruction of objects with static, thread, or automatic storage duration
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
11.08.2014, 21:41     Ссылка на временный объект #20
Цитата Сообщение от Croessmah Посмотреть сообщение
а как же:
Все это хорошо, только не понятно к чему ты это написал. Никаких откровений я тут не увидел.
Я честно пытался угадать что ты имел в виду, но что-то не выходит. Поясни.

Добавлено через 8 минут
Хотя я кажется догадался. Если каким-либо образом нарушить вышеописанные правила, то получим висячие ссылки. Ну так на это у меня как раз была заготовлена фраза:
Цитата Сообщение от DrOffset Посмотреть сообщение
если ты сейчас приведешь пяток способов создать висячую ссылку, то это не будет значить, что я не прав. А будет значить только лишь то, что нет в мире совершенных инструментов (наш мозг в том числе).
С++ не из тех языков, которые будут поддерживать штаны разработчика. Следовательно ожидать от него чрезмерной заботы не стоит. Достаточно уже того, что все эти моменты описаны в стандарте. Если подумать, то легко можно объяснить, почему такие вещи не запрещены синтаксисом. Я думаю, ты и сам это знаешь.
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,067
Записей в блоге: 3
Завершенные тесты: 1
11.08.2014, 21:51     Ссылка на временный объект #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Все это хорошо, только не понятно к чему ты это написал. Никаких откровений я тут не увидел.
Я честно пытался угадать что ты имел в виду, но что-то не выходит. Поясни.
C++
1
2
С & c = C(); // <-- Этот временный объект будет уничтожен тогда, когда изничтожится ссылка(только, наверное, стоит const C & сделать)
c.foo(); //поэтому здесь объект жив и ссылка не висячая.
Если что-то путаю, поправьте.
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
11.08.2014, 22:22     Ссылка на временный объект #22
Цитата Сообщение от Croessmah Посмотреть сообщение
Если что-то путаю, поправьте.
Этот пример вообще не соберется на компиляторе, который соответствует стандарту. Если предположить, что он собирается, то, вероятно у него может быть такое же поведение, как в случае с const ссылкой (согласно тому пункту правил). Т.е. время жизни продлится. В этом смысле ты ничего не путаешь и абсолютно прав. Теперь я понял на что ты намекал.
Ладно, признаю, пример был не удачен.
Я думаю, гораздо более убедительно будет выглядеть аргументация запрета изменения временных объектов.
Скажем, в той же Visual Studio (в которой такое разрешено) делается разница между:
C++
1
2
int & a1 = int(2); // нельзя
Int & a2 = Int(2); // можно
а это добавляет исключений из правил в копилку С++. А запрет вносит хотя бы формальное единообразие.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2014, 01:11  [ТС]     Ссылка на временный объект #23
Не совсем понял если честно, при чем тут висячие ссылки. Вопрос был о временном объекте, о его законном времени жизни, и о использовании его в это время, то есть до точки с запятой.
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
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++
Подскажите, в чем ошибка и как исправить. struct Node{ Node *prev; Point *point; Node() { prev = nullptr; ...

Ссылка на объект как свойство класса - C++
Добрый вечер. Есть 2 класса: сотрудники и компании. Если использовать БД то вопрос бы решался очень просто, он почитав не много понял...

Временный _getch() - C++
Всем доброго времени суток, хочу спросить, как можно сделать временный _getch(), тоесть если в течении определённого времени не была нажата...


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

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

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