Здравствуйте, ollv, Вы писали:
O>>> Так погоди. Давай я сначала попробую сказать точнее, почему я связываю кейсы
O>>>O>>> type& v = getrvalue();
O>>> call(getrvalue(), ...);
O>>>
BFE>>По моим представлением эти два выражения ничем не отличаются с точки зрения жизни временных объектов. Оба временных объекта должны дожить, условно говоря, "до точки с запятой".
O>Вот этимологически как оно было.
O>https://stackoverrun.com/ru/q/6489490
O> Таким образом простая ссылка в майкрософт, вела (сейчас они уже по умолчанию отключают такую возможность) себя как константная в стандарте.
O>Причем замечу
O>The word const was never present in this section. The rule has always been (from as long as I can remember) that a temporary used to initialize a reference has its lifetime extended to match that of the reference, regardless of the type of the reference.
O> И, кстати, говорят о продлении lifetime
Говорят о продлении жизни объекта для ссылки v после выполнения:
type& v = getrvalue();.
Это несколько отличается от времени жизни объекта созданного в
call(getrvalue(), ...);. После выполнения этого выражения объект созданный в getrvalue() умирает в отличии от объекта на который ссылается v.
type& v = getrvalue(); // (1)
call(getrvalue(), ...); // (2)
// вот тут у MS обект созданный в (1) продолжает жить, а объект созданный в (2) уже разрушен.
Поэтому, на мой взгляд, говорить о продлении жизни для объекта созданного в
call(getrvalue(), ...); смысла нет.
O> Глядя на стандарт и диаграммку
O>expression
O> | \
O>glvalue rvalue
O> | | \
O>lvalue xvalue prvalue
O> Возникают смутные сомнения, что скопипащено оно было с некоей грамматики. Отсюда и это странное смешение — rvalue и выражения. Хотя вот эти ветвления скорее обоснованы структурами синтаксического разбора,
Вот тут я согласен. У меня тоже сложилось впечатление, что вместо описания языка мы имеет описание работы парсера.
O>>>>> И если арг не проинициализируется от рвелью и не продлит жизнь объекту, он умрет.
BFE>>>>Если арг не проинициализируется, то и функция вызвана не будет. Причём тут продление жизни для ссылок?
O>>> так именно. "если проинициализируется и продлит жизнь". А то может ведь и не продлить (получим битую ссылку в теле)
BFE>>Я не могу придумать конструкцию вызова функции без инициализации аргумента.
O>Но я не про инициализацию говорил, я говорил про потенциальную вероятность того, что ссылка окажется битая, т/к каким-то образом не произойдет материализация временного объекта (т/к там просто референс)
Существование ссылки без инициализации запрещено, так что такой ситуации быть не может.