Здравствуйте, ollv, Вы писали:
O> Так погоди. Давай я сначала попробую сказать точнее, почему я связываю кейсы
O>O> type& v = getrvalue();
O> call(getrvalue(), ...);
O>
O> в обоих случаях происходит инициализация простой ссылки от рвелью. В первом случае это совсем критично, потому как в gcc (я тут даже версию не вспомню версию) есть кейсы, где это компиябильно, но продления жизни для темпорари object не происходит (и еще вопрос, происходит ли тут вообще материализация temporary object), во втором спасает только то, что оно не компилируется. т/к тоже вопрос, если вдруг произойдет кейс, где оно скомпилируется, произойдет ли там материализация temporary obj. И совершенно все равно каким рулом будет продлена жизнь темп объекта.
По моим представлением эти два выражения ничем не отличаются с точки зрения жизни временных объектов. Оба временных объекта должны дожить, условно говоря, "до точки с запятой". Я не совсем понимаю зачем нужно расписывать в стандарте "продление жизни" если прямо сказано, что:
Temporary objects are destroyed as the last step in evaluating the full-expression
Можно же написать:
getrvalue().print();. Тут тоже есть "продление жизни"?
O>>> Не знаю о чем ты )) к rvalue вполне применим термин lifetime.
BFE>>Что обозначает lifetime для rvalue?
O> Да сплошь и рядом говорят lifetime of rvalue. lifetime of expression
O>Тут получается небольшой конфликт понятий если rvalue это выражение — то выражение суть понятия из синтаксического анализа. И мы тут перемешиваем понятия из синтаксиса и физики языка. А по сути rvalue — рантайм физика языка, а потому звать его выражением, как его понимать ? это не синтаксическое выражение ? ))
O> А так понятно, что касательно этого примера исключительно в С++ говорим о object lifetime.
Видимо из-за этой путаницы терминологии я ничего не понимаю. Есть выражения разных категорий. Они (выражения) могут либо порождать временные объекты, либо нет. Если временные объекты были материализованы, то можно говорить о времени их жизни. Зачем при этом привязывать время жизни временного объекта к категории выражения мне совершенно не понятно. Это же независимые понятия.
O>>>Объект — это уже физика языка, так вот живет объект как rvalue, выражением в данном случае будет именно std::vector<int>() -> arg, вот здесь оно и умрет, после инициализации параметра.
BFE>>Выражение умрёт? Или умрёт объект?
O> Давай так ) если считать, что мы принимаем связывание rvalue с простой ссылкой, то работает это правило
O> (6.9) — A temporary object bound to a reference parameter in a function call (7.6.1.2) persists until the
O>completion of the full-expression containing the call.
Зачем нужна эта сентенция, если утверждение процитированное выше —
O>>> И если арг не проинициализируется от рвелью и не продлит жизнь объекту, он умрет.
BFE>>Если арг не проинициализируется, то и функция вызвана не будет. Причём тут продление жизни для ссылок?
O> так именно. "если проинициализируется и продлит жизнь". А то может ведь и не продлить (получим битую ссылку в теле)
Я не могу придумать конструкцию вызова функции без инициализации аргумента.