1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|||||||||||
1 | |||||||||||
Ссылка на временный объект11.08.2014, 03:24. Показов 3875. Ответов 24
Метки нет (Все метки)
Наткнулся тут в гугле на одну интересную тему.
Как известно, данный код не соответствует стандарту, и не будет скомпилирован многими современными компиляторами:
0
|
11.08.2014, 03:24 | |
Ответы с готовыми решениями:
24
Не создаётся ссылка на временный объект Временный объект Временный объект и конструктор копирования Возвращение const ссылки на временный объект |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
11.08.2014, 08:56 | 3 |
Выражение A(); является rvalue. Причем неконстантным rvalue.
Метод getThis() возвращает lvalue. Потому и валиден.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
11.08.2014, 12:51 [ТС] | 4 |
Почему компилируется понянто. Вопрос в другом, почему в этом случая временный объект живет до выхода из функции. Интересует не техническая часть, а почему это допустили. По сути мы схитрили и все же использовали временный объект для передали по ссылке в качестве параметра.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
11.08.2014, 12:58 | 5 |
Toshkarik, временные объекты пока выполняется выражение.
Мб кто-нибудь приведет прямо ссылку на стандарт.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
11.08.2014, 13:07 [ТС] | 7 |
И про это в курсе, имеется в виду full-expression, ссылку на стандарт сейчас не дам, так как не помню. Может опять неправильно выразился. Попробуем наоборот: если возможен второй вариант, то почему запретили первый? Это же выглядит немного как "хак". Может быть, это одна из причин появления rvalue-reference в C++11...
Не по теме: upd: А вот и стандарт :)
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
11.08.2014, 13:19 | 8 |
Toshkarik, Как-то спрашивал про то, почему разрешена конверсия от rvalue к lvalue на SO, впринципе там ответили довольно полно: http://stackoverflow.com/quest... ual-studio
2
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
||||||
11.08.2014, 13:39 | 9 | |||||
Это попытка запретить опасное использование. Если я не ошибаюсь, то предложение запрета первого варианта исходил от самого Страуструпа. А второй вариант запретить нельзя. Потому что, например, его не отличить вот от такого (пример утрирован):
1
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
11.08.2014, 14:23 [ТС] | 11 |
Так ведь непонятно в данном случае - от чего защищают?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
11.08.2014, 14:27 | 12 | |||||
Toshkarik, Не знаю насколько я буду прав, но первый вариант не должен работать для POD типов, для них ведь никак не сэмулировать второй вариант. В то время как для классов вцелом может.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
11.08.2014, 14:46 [ТС] | 14 |
ForEveR, сейчас вопрос уже не в эмуляции, а в самом запрете. Ведь вполне можно было создать временный объект, даже POD, и передать его в функцию по ссылке, если гарантируется его время жизни ( временного объекта ).
Ну почему сразу бесполезной, вполне можно найти полезное применение. Ведь это одна из целей, как я понимаю, rvalue reference. Возможно, ошибаюсь.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
11.08.2014, 15:02 [ТС] | 16 |
Я уже не найду, наверно, статью, в которой показывались новшества C++11 и способы достижения некоторых из них в C++03( 98 ). Я ведь не настаиваю ни на чем. Просто хотелось бы понять "создателей" языка/стандартов. Если бы небыло хоть в чем то полезным, то я не нашел бы этого способа в интернете. Конечно, я понимаю, что экспериментаторов тоже хватает.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
11.08.2014, 15:38 | 17 |
Они не боги, а такие же люди. Не каждая возможность языка имеет глубокий смысл и кейс к применению, где иначе было бы нельзя.
"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/... alks/1954/
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
||||||
11.08.2014, 18:11 | 18 | |||||
Защита в том числе от висячих ссылок. Уж больно просто их создать становится.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
11.08.2014, 21:41 | 20 |
Все это хорошо, только не понятно к чему ты это написал. Никаких откровений я тут не увидел.
Я честно пытался угадать что ты имел в виду, но что-то не выходит. Поясни. Добавлено через 8 минут Хотя я кажется догадался. Если каким-либо образом нарушить вышеописанные правила, то получим висячие ссылки. Ну так на это у меня как раз была заготовлена фраза: С++ не из тех языков, которые будут поддерживать штаны разработчика. Следовательно ожидать от него чрезмерной заботы не стоит. Достаточно уже того, что все эти моменты описаны в стандарте. Если подумать, то легко можно объяснить, почему такие вещи не запрещены синтаксисом. Я думаю, ты и сам это знаешь.
0
|
11.08.2014, 21:41 | |
11.08.2014, 21:41 | |
Помогаю со студенческими работами здесь
20
Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект Ссылка на объект класса Ссылка на объект класса в массиве Ссылка на объект, возвращаемый функцией Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |