Информация об изменениях

Сообщение Re[9]: Правомерно ли такое от 19.08.2020 9:11

Изменено 19.08.2020 12:46 Маркуша Шулин

Re[9]: Правомерно ли такое
Здравствуйте, B0FEE664, Вы писали:

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

Так погоди. Давай я сначала попробую сказать точнее, почему я связываю кейсы
  type& v = getrvalue();
  call(getrvalue(), ...);

в обоих случаях происходит инициализация простой ссылки от рвелью. В первом случае это совсем критично, потому как в gcc (я тут даже версию не вспомню версию) есть кейсы, где это компиябильно, но продления жизни для темпорари object не происходит (и еще вопрос, происходит ли тут вообще материализация temporary object), во втором спасает только то, что оно не компилируется. т/к тоже вопрос, если вдруг произойдет кейс, где оно скомпилируется, произойдет ли там материализация temporary obj. И совершенно все равно каким рулом будет продлена жизнь темп объекта.
Видишь ли практик, я считаю, мыслит прецедентарно. Если прецедент был (а он был в практике) эта практика метится как ущербная. В этом случае совсем не тяжело просто перенести создание объекта выше.

O>> Не знаю о чем ты )) к rvalue вполне применим термин lifetime.

BFE>Что обозначает lifetime для rvalue?
Да сплошь и рядом говорят lifetime of rvalue. lifetime of expression
Тут получается небольшой конфликт понятий если rvalue это выражение — то выражение суть понятия из синтаксического анализа. И мы тут перемешиваем понятия из синтаксиса и физики языка. А по сути rvalue — рантайм физика языка, а потому звать его выражением, как его понимать ? это не синтаксическое выражение ? ))
А так понятно, что касательно этого примера исключительно в С++ говорим о object lifetime.

O>>Что касается выражения, синтаксически все, что попадает в конечном счете в АСТ — expression. такова селяви синтаксического анализа.

BFE>И какое отношение это имеет ко времени жизни?
а это и не о времени жизни. это о том, что "rvalue — это выражение". Хоть стандарт и показывает нам именно так, это имхо немного неровно.

O>>Объект — это уже физика языка, так вот живет объект как rvalue, выражением в данном случае будет именно std::vector<int>() -> arg, вот здесь оно и умрет, после инициализации параметра.

BFE>Выражение умрёт? Или умрёт объект?
Давай так ) если считать, что мы принимаем связывание rvalue с простой ссылкой, то работает это правило
[quote] (6.9) — A temporary object bound to a reference parameter in a function call (7.6.1.2) persists until the
completion of the full-expression containing the call. [/quote]

BFE>>>А вот временные объекты обязаны дожить (по стандарту) до конца выполнения выражения,

O>> Только вот конец выражения будет ровно после запятой (или скобки), std::vector<int>() -> arg.
BFE>Конец full-expression'а?


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

BFE>Если арг не проинициализируется, то и функция вызвана не будет. Причём тут продление жизни для ссылок?

так именно. "если проинициализируется и продлит жизнь". А то может ведь и не продлить (получим битую ссылку в теле)
Re[9]: Правомерно ли такое
Здравствуйте, B0FEE664, Вы писали:

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

Так погоди. Давай я сначала попробую сказать точнее, почему я связываю кейсы
  type& v = getrvalue();
  call(getrvalue(), ...);

в обоих случаях происходит инициализация простой ссылки от рвелью. В первом случае это совсем критично, потому как в gcc (я тут даже версию не вспомню версию) есть кейсы, где это компиябильно, но продления жизни для темпорари object не происходит (и еще вопрос, происходит ли тут вообще материализация temporary object), во втором спасает только то, что оно не компилируется. т/к тоже вопрос, если вдруг произойдет кейс, где оно скомпилируется, произойдет ли там материализация temporary obj. И совершенно все равно каким рулом будет продлена жизнь темп объекта.
Видишь ли практик, я считаю, мыслит прецедентарно. Если прецедент был (а он был в практике) эта практика метится как ущербная. В этом случае совсем не тяжело просто перенести создание объекта выше.

O>> Не знаю о чем ты )) к rvalue вполне применим термин lifetime.

BFE>Что обозначает lifetime для rvalue?
Да сплошь и рядом говорят lifetime of rvalue. lifetime of expression
Тут получается небольшой конфликт понятий если rvalue это выражение — то выражение суть понятия из синтаксического анализа. И мы тут перемешиваем понятия из синтаксиса и физики языка. А по сути rvalue — рантайм физика языка, а потому звать его выражением, как его понимать ? это не синтаксическое выражение ? ))
А так понятно, что касательно этого примера исключительно в С++ говорим о object lifetime.

O>>Что касается выражения, синтаксически все, что попадает в конечном счете в АСТ — expression. такова селяви синтаксического анализа.

BFE>И какое отношение это имеет ко времени жизни?
а это и не о времени жизни. это о том, что "rvalue — это выражение". Хоть стандарт и показывает нам именно так, это имхо немного неровно.

O>>Объект — это уже физика языка, так вот живет объект как rvalue, выражением в данном случае будет именно std::vector<int>() -> arg, вот здесь оно и умрет, после инициализации параметра.

BFE>Выражение умрёт? Или умрёт объект?
Давай так ) если считать, что мы принимаем связывание rvalue с простой ссылкой, то работает это правило
 (6.9) — A temporary object bound to a reference parameter in a function call (7.6.1.2) persists until the
completion of the full-expression containing the call.


BFE>>>А вот временные объекты обязаны дожить (по стандарту) до конца выполнения выражения,

O>> Только вот конец выражения будет ровно после запятой (или скобки), std::vector<int>() -> arg.
BFE>Конец full-expression'а?


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

BFE>Если арг не проинициализируется, то и функция вызвана не будет. Причём тут продление жизни для ссылок?

так именно. "если проинициализируется и продлит жизнь". А то может ведь и не продлить (получим битую ссылку в теле)