Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, ollv, Вы писали:
BFE>Это не политика. Это та проблема стандарта, которую решили введением move семантики. Только вот Майкрософт эту проблему пытался решить до введения move семантики и из-за обратной совместимости отказаться от такого решения не может.
это и есть политика. Неконстантная ссылка не должна продлевать жизнь объекта, по стандарту. У майкрософта это не так. Считать допустимо это, или нет — вопрос политический.
O>>>>+ к тому есть продление жизни для ссылок — тоже опасное поведение, с такими трюками можно легко запутаться особенно присутствуют сложные вычисления типов BFE>>>Здесь нет продления жизни для ссылок. O>>есть но завуалированное. ссылка принимает rvalue и объект живет, в то время как rvalue уже умирает по стандарту после вызова конструктора. Потому оно и не компилируется в джисях BFE>rvalue — это выражение, оно не может жить или умереть.
Не знаю о чем ты )) к rvalue вполне применим термин lifetime. Что касается выражения, синтаксически все, что попадает в конечном счете в АСТ — expression. такова селяви синтаксического анализа. Объект — это уже физика языка, так вот живет объект как rvalue, выражением в данном случае будет именно std::vector<int>() -> arg, вот здесь оно и умрет, после инициализации параметра.
BFE>А вот временные объекты обязаны дожить (по стандарту) до конца выполнения выражения,
Только вот конец выражения будет ровно после запятой (или скобки), std::vector<int>() -> arg. И если арг не проинициализируется от рвелью и не продлит жизнь объекту, он умрет.
BFE>так что вектор std::vector<int>() обязан дожить до конца выполнения функции push_back_helper.
Не совсем понимаю, что тут кто кому должен, если такая передача некорректна изначально. майкрософтовский вариант скорее попытка решить свои проблемы, за счет стандарта. И это — политика.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.