285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
1 | |
Временные объекты и ссылки16.02.2018, 18:38. Показов 3490. Ответов 13
Метки нет (Все метки)
При инициализации ссылки временным объектом, ссылка должна быть либо rvalue-ссылкой, либо lvalue-ссылкой на const.
Однако, несмотря на то, что выбрасывание исключения создаёт временный объект (http://eel.is/c++draft/class.temporary#1.3), его можно забиндить к lvalue-ссылке на не-conts в catch .Почему, зачем нужна такая непоследовательность в языке?
0
|
16.02.2018, 18:38 | |
Ответы с готовыми решениями:
13
Ссылки на временные объекты Теория, Временные объекты Необязательные временные объекты Временные объекты встроенного типа |
║XLR8║
|
|
16.02.2018, 20:27 | 2 |
Исключения это не магия, значение исключения хранится в определенном месте (массиве), не помню точно где. Поэтому объект где-то лежить как lvaue и взять из него неконстантную ссылку можно.
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
16.02.2018, 20:42 [ТС] | 3 |
Временный объект, создаваемый при инициализации ссылки, тоже хранится и у него даже можно взять адрес. И выражение, состоящее из имени ссылки, будет lvalue.
Неконстантную rvalue-ссылку тоже можно инициализировать временным объектом. Да можно и применить const_cast к lvalue-ссылке на const и модифицировать объект через эту ссылку. Это даже не будет UB, если только сам объект не был константным.
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
16.02.2018, 20:54 [ТС] | 5 |
Croessmah, и?
0
|
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
|
|
16.02.2018, 21:47 | 6 |
из книги Зуев Стандарт С++ (тоже самое):
Возбуждение исключительной ситуации инициализирует-копированием (8.5, 12.8), временный объект, называемый объектом исключения (exception object). Этот временный объект считается 1-значением и используется для инициализации переменной, имя которой указано в совпадающем обработчике (15.3). Если тип объекта исключения является неполным или указателем на неполный тип, отличным от (возможно, cv-квалифицированного) void, то программа считается неправильной. Если я всё правильно понял, то для этого и нужна
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
16.02.2018, 23:46 [ТС] | 7 |
Croessmah, Recrut_rf, понимаете ли, коллеги: сказать, что временный объект, созданный при выбырасывании исключения, можно биндить к lvalue-ссылке на неконстанту и сказать, что этот временный объект является lvalue — это в общем одно и то же. А меня всё же интересует ответ, а не переформулировка вопроса.
Спасибо.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
17.02.2018, 01:23 | 8 |
Ответ заключается в том, что ТС ошибается, полагая, что в стандарте рассматривается привязка к ссылке каких-то временных объектов.
Речь о привязке к ссылке идет исключительно в терминах lvalue/rvalue. В этом ТС может убедиться самостоятельно: http://eel.is/c++draft/dcl.init.ref. Из пункта О том, что временный объект исключения обозначает lvalue было сказано выше: Так что тут нет никакой непоследовательности. PS. На всякий случай скажу, предвидя попытку поспорить, что категория выражения первична в вопросе привязки к ссылке, а временность объекта, который в итоге получается - вторична. Как только мы мысленно меняем эти приоритеты, создается иллюзия непоследовательности.
2
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
17.02.2018, 17:55 [ТС] | 9 |
Но при этом ссылка ссылается на объект, обозначаемый выражением, а не байндится к "самому выражению", не так ли?
Черри-пикингом я и сам умею заниматься:
Сообщение от http://eel.is/c++draft/dcl.init.ref#2.sentence-1
Сообщение от http://eel.is/c++draft/dcl.init.ref#5.3
Сообщение от http://eel.is/c++draft/dcl.ref#5.sentence-3
Ну ладно, пускай будет так Добавлено через 1 час 42 минуты Ну или DrOffset ошибается, полагая, что в стандарте не рассматривается привязка к ссылке каких-то временных объектов
Сообщение от http://eel.is/c++draft/class.temporary#6.sentence-1
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
17.02.2018, 18:12 | 10 |
Плохо умеем. Еще раз читаем: при инициализации ссылки рассматривается категория инициализирущего выражения, а не временность объекта. То, что ссылка в конечном счете привязывается к объекту, временному или нет, никак не отменяет вышеозначенного факта.
DrOffset просто расставил приоритеты в верном порядке. Любая фраза может быть понята превратно в произвольном контексте, чем успешном пользуются злые джинны в сказках. Поэтому вы софистикой не занимайтесь, а просто подставьте к моей фразе вами же заданный контекст.
1
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
17.02.2018, 19:42 [ТС] | 11 |
По-моему, там сказано, что lvalue обозначает временный объект, а не наоборот.
Про это уже мною сказано в #7 После вас. Уточню в чём мне видится непоследовательность: в обозначении временного объекта lvalue-ом, причём "напрямую". Можно забайндить ссылку к временному объекту и после этого обозначать его lvalue-выражением, но это не "напрямую". Как-то это странно. Думаю, изъян здесь в обзывании объекта-исключения временным. Для такого временного объекта ещё приходится придумывать спец. правила времени жизни.
1
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
27.07.2018, 13:15 [ТС] | 12 |
И в том же стандарте (было) сказано, что выражение denoting temporary — это по определению prvalue.
Только в C++17 это противоречие устранили.
0
|
Mournful Max
|
27.07.2018, 16:30
Временные объекты и ссылки
#14
|
Не по теме: Croessmah, тогда никто не выпустится :stop:
0
|
27.07.2018, 16:30 | |
27.07.2018, 16:30 | |
Помогаю со студенческими работами здесь
14
"Анонимные" (временные) объекты? Создать указатели и ссылки на объекты в памяти Ссылки на объекты в функции с не заданным типом переменных Как правильно массиву объектов присвоить ссылки на объекты. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |