Здравствуйте, 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. Я болен ПГМ.