С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
1

Временные объекты и ссылки

16.02.2018, 18:38. Показов 3490. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При инициализации ссылки временным объектом, ссылка должна быть либо rvalue-ссылкой, либо lvalue-ссылкой на const.
Однако, несмотря на то, что выбрасывание исключения создаёт временный объект (http://eel.is/c++draft/class.temporary#1.3), его можно забиндить к lvalue-ссылке на не-conts в catch.

Почему, зачем нужна такая непоследовательность в языке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2018, 18:38
Ответы с готовыми решениями:

Ссылки на временные объекты
Здравствуйте! В процессе экспериментов с С++ появились некоторые непонятки. Рассмотрим код: ...

Теория, Временные объекты
Прошу ответить на пару вопросов. Конкретный вопрос: В тексте while (Pos !=...

Необязательные временные объекты
Помогите с задачкой: Класс Car содержит модель автомобиля. Функция Find определяет, присутствует...

Временные объекты встроенного типа
Привет! пытаюсь углубляться в C++, решил почитать книгу Саттера, на первом примере, остановился и...

13
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
16.02.2018, 20:27 2
Цитата Сообщение от rat0r Посмотреть сообщение
его можно забиндить к lvalue-ссылке на не-conts в catch.
Исключения это не магия, значение исключения хранится в определенном месте (массиве), не помню точно где. Поэтому объект где-то лежить как lvaue и взять из него неконстантную ссылку можно.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
16.02.2018, 20:42  [ТС] 3
Цитата Сообщение от outoftime Посмотреть сообщение
Исключения это не магия, значение исключения хранится в определенном месте
Временный объект, создаваемый при инициализации ссылки, тоже хранится и у него даже можно взять адрес. И выражение, состоящее из имени ссылки, будет lvalue.

Цитата Сообщение от outoftime Посмотреть сообщение
взять из него неконстантную ссылку можно.
Неконстантную rvalue-ссылку тоже можно инициализировать временным объектом. Да можно и применить const_cast к lvalue-ссылке на const и модифицировать объект через эту ссылку. Это даже не будет UB, если только сам объект не был константным.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,933
Записей в блоге: 1
16.02.2018, 20:52 4
Цитата Сообщение от rat0r Посмотреть сообщение
что выбрасывание исключения создаёт временный объект
из стандарта:
Throwing an exception copy-initializes (11.6, 15.8) a temporary object, called the exception object. An lvalue denoting the temporary is used to initialize the variable declared in the matching handler (18.3). If the type of the exception object would be an incomplete type or a pointer to an incomplete type other than cv void the program is ill-formed.
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
Цитата Сообщение от rat0r Посмотреть сообщение
Croessmah, и?
из книги Зуев Стандарт С++ (тоже самое):
Возбуждение исключительной ситуации инициализирует-копированием (8.5,
12.8), временный объект, называемый объектом исключения (exception
object). Этот временный объект считается 1-значением и используется для
инициализации переменной, имя которой указано в совпадающем
обработчике (15.3).
Если тип объекта исключения является неполным или указателем на
неполный тип, отличным от (возможно, cv-квалифицированного) void, то
программа считается неправильной.

Цитата Сообщение от rat0r Посмотреть сообщение
Почему, зачем нужна такая непоследовательность в языке?
Если я всё правильно понял, то для этого и нужна
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
Цитата Сообщение от rat0r Посмотреть сообщение
А меня всё же интересует ответ, а не переформулировка вопроса.
Ответ заключается в том, что ТС ошибается, полагая, что в стандарте рассматривается привязка к ссылке каких-то временных объектов.
Цитата Сообщение от rat0r Посмотреть сообщение
При инициализации ссылки временным объектом, ссылка должна быть либо rvalue-ссылкой, либо lvalue-ссылкой на const.
Речь о привязке к ссылке идет исключительно в терминах lvalue/rvalue. В этом ТС может убедиться самостоятельно: http://eel.is/c++draft/dcl.init.ref.

Из пункта
(5.1) If the reference is an lvalue reference and the initializer expression
(5.1.1) is an lvalue (but is not a bit-field), and “cv1 T1” is reference-compatible with “cv2 T2”, or
(5.1.2) has a class type (i.e., T2 is a class type), where T1 is not reference-related to T2, and can be converted to an lvalue of type “cv3 T3”, where “cv1 T1” is reference-compatible with “cv3 T3”108 (this conversion is selected by enumerating the applicable conversion functions ([over.match.ref]) and choosing the best one through overload resolution),

then the reference is bound to the initializer expression lvalue in the first case and to the lvalue result of the conversion in the second case (or, in either case, to the appropriate base class subobject of the object).
очевидно, что если инициализирующее выражение является lvalue, то нет никаких препятствий для привязки его результата к ссылке.

О том, что временный объект исключения обозначает lvalue было сказано выше:
Цитата Сообщение от Croessmah Посмотреть сообщение
An lvalue denoting the temporary is used to initialize the variable declared in the matching handler
Так что тут нет никакой непоследовательности.

PS. На всякий случай скажу, предвидя попытку поспорить, что категория выражения первична в вопросе привязки к ссылке, а временность объекта, который в итоге получается - вторична. Как только мы мысленно меняем эти приоритеты, создается иллюзия непоследовательности.
2
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
17.02.2018, 17:55  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Речь о привязке к ссылке идет исключительно в терминах lvalue/rvalue.
Но при этом ссылка ссылается на объект, обозначаемый выражением, а не байндится к "самому выражению", не так ли?

Цитата Сообщение от DrOffset Посмотреть сообщение
В этом ТС может убедиться самостоятельно
Черри-пикингом я и сам умею заниматься:
Цитата Сообщение от http://eel.is/c++draft/dcl.init.ref#2.sentence-1
2 A reference cannot be changed to refer to another object after initialization.
Цитата Сообщение от http://eel.is/c++draft/dcl.init.ref#5.3
(5.3) Otherwise, if the initializer expression

(5.3.1) is an rvalue (but not a bit-field) or function lvalue and “cv1 T1” is reference-compatible with “cv2 T2”, or
(5.3.2) has a class type (i.e., T2 is a class type), where T1 is not reference-related to T2, and can be converted to an rvalue or function lvalue of type “cv3 T3”, where “cv1 T1” is reference-compatible with “cv3 T3” (see [over.match.ref]),

then the value of the initializer expression in the first case and the result of the conversion in the second case is called the converted initializer.
If the converted initializer is a prvalue, its type T4 is adjusted to type “cv1 T4” ([conv.qual]) and the temporary materialization conversion is applied.
In any case, the reference is bound to the resulting glvalue (or to an appropriate base class subobject).
Цитата Сообщение от http://eel.is/c++draft/dcl.ref#5.sentence-3
A reference shall be initialized to refer to a valid object or function.
Это несложно.

Цитата Сообщение от DrOffset Посмотреть сообщение
категория выражения первична в вопросе привязки к ссылке, а временность объекта, который в итоге получается - вторична.
Ну ладно, пускай будет так

Добавлено через 1 час 42 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
ТС ошибается, полагая, что в стандарте рассматривается привязка к ссылке каких-то временных объектов.
Ну или DrOffset ошибается, полагая, что в стандарте не рассматривается привязка к ссылке каких-то временных объектов
Цитата Сообщение от http://eel.is/c++draft/class.temporary#6.sentence-1
The third context is when a reference is bound to a temporary object.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
17.02.2018, 18:12 10
Цитата Сообщение от rat0r Посмотреть сообщение
Черри-пикингом я и сам умею заниматься:
Плохо умеем. Еще раз читаем: при инициализации ссылки рассматривается категория инициализирущего выражения, а не временность объекта. То, что ссылка в конечном счете привязывается к объекту, временному или нет, никак не отменяет вышеозначенного факта.

Цитата Сообщение от rat0r Посмотреть сообщение
Ну или DrOffset ошибается, полагая, что в стандарте не рассматривается привязка к ссылке каких-то временных объектов
DrOffset просто расставил приоритеты в верном порядке. Любая фраза может быть понята превратно в произвольном контексте, чем успешном пользуются злые джинны в сказках. Поэтому вы софистикой не занимайтесь, а просто подставьте к моей фразе вами же заданный контекст.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
17.02.2018, 19:42  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
временный объект исключения обозначает lvalue было сказано выше
По-моему, там сказано, что lvalue обозначает временный объект, а не наоборот.

Цитата Сообщение от DrOffset Посмотреть сообщение
при инициализации ссылки рассматривается категория инициализирущего выражения
Про это уже мною сказано в #7

Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому вы софистикой не занимайтесь
После вас.

Цитата Сообщение от DrOffset Посмотреть сообщение
категория выражения первична в вопросе привязки к ссылке, а временность объекта, который в итоге получается - вторична. Как только мы мысленно меняем эти приоритеты, создается иллюзия непоследовательности.
Уточню в чём мне видится непоследовательность: в обозначении временного объекта lvalue-ом, причём "напрямую". Можно забайндить ссылку к временному объекту и после этого обозначать его lvalue-выражением, но это не "напрямую". Как-то это странно. Думаю, изъян здесь в обзывании объекта-исключения временным. Для такого временного объекта ещё приходится придумывать спец. правила времени жизни.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
27.07.2018, 13:15  [ТС] 12
Цитата Сообщение от Croessmah Посмотреть сообщение
из стандарта:
An lvalue denoting the temporary
И в том же стандарте (было) сказано, что выражение denoting temporary — это по определению prvalue.

Только в C++17 это противоречие устранили.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,933
Записей в блоге: 1
27.07.2018, 13:28 13
rat0r, тебе бы учителем в школе работать - ошибки в работах учеников искать.
0
Mournful Max
27.07.2018, 16:30     Временные объекты и ссылки
  #14

Не по теме:

Croessmah, тогда никто не выпустится :stop:

0
27.07.2018, 16:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2018, 16:30
Помогаю со студенческими работами здесь

"Анонимные" (временные) объекты?
Пусть имеется класс T: class T { public: int a; int b; T(int _a, int _b) : a(_a), b(_b) {}...

Создать указатели и ссылки на объекты в памяти
Помогите, кто может Создайте в свободной памяти три объекта различных типов (Cat, Worker,...

Ссылки на объекты в функции с не заданным типом переменных
Как правильно передавать ссылки на объекты в функции с не заданным типом переменных и возможно ли...

Как правильно массиву объектов присвоить ссылки на объекты.
TPoint Point,*p_Point; p_Point = Point; TPoint Mass; for (i=0; i<10; i++) { Mass =...


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

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