Re[13]: Правомерно ли такое
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 25.08.20 20:56
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, ollv, Вы писали:



BFE>
BFE>  type& v = getrvalue();   // (1)
BFE>  call(getrvalue(), ...);  // (2)
BFE>  // вот тут у MS обект созданный в (1) продолжает жить, а объект созданный в (2) уже разрушен.
BFE>


Я именно и пытался сказать, что ссылка обычная ссылка в МС ведет себя не по стандарту, и позволяет себя инициализировать от rvalue, что по сути и приводит к неоднозначности при переходе от одного компилятора к другому. Именно инициализация простой ссылки от rvalue и есть кривизна / опасность в данном подходе. Что собственно я и пытаюсь утверждать вот уже несколько постов. Разве что мне этимологически стало понятно откуда растут грабли. А именно потому, что майкрософт решила взять поведение ссылки, которое было еще до появления стандарта.

BFE>Поэтому, на мой взгляд, говорить о продлении жизни для объекта созданного в call(getrvalue(), ...); смысла нет.


Я думаю, что вопрос тут скорее о тех кейсах, в которых gcc таки соберет код, в котором идет инициализация ссылки от rvalue, но вот extend lifetime не произойдет (или материализации темп объекта). Имхо такие вещи лучше снабжать комментариями, и пытаться избегать инициализации простой ссылки rvalue. Т/е падение точно было type& r = getrvalue(); т/к здесь шло получение битой ссфлки.

O>> Глядя на стандарт и диаграммку

O>>expression
O>> | \
O>>glvalue rvalue
O>> | | \
O>>lvalue xvalue prvalue
O>> Возникают смутные сомнения, что скопипащено оно было с некоей грамматики. Отсюда и это странное смешение — rvalue и выражения. Хотя вот эти ветвления скорее обоснованы структурами синтаксического разбора,

BFE>Вот тут я согласен. У меня тоже сложилось впечатление, что вместо описания языка мы имеет описание работы парсера.


O>>>>>> И если арг не проинициализируется от рвелью и не продлит жизнь объекту, он умрет.

BFE>>>>>Если арг не проинициализируется, то и функция вызвана не будет. Причём тут продление жизни для ссылок?
O>>>> так именно. "если проинициализируется и продлит жизнь". А то может ведь и не продлить (получим битую ссылку в теле)
BFE>>>Я не могу придумать конструкцию вызова функции без инициализации аргумента.
O>>Но я не про инициализацию говорил, я говорил про потенциальную вероятность того, что ссылка окажется битая, т/к каким-то образом не произойдет материализация временного объекта (т/к там просто референс)
BFE>Существование ссылки без инициализации запрещено, так что такой ситуации быть не может.
Вопрос чем? Речь идет о не безопасности такого подхода вообще.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.