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

Сообщение Re[99]: Когда это наконец станет defined behavior? от 22.08.2023 0:03

Изменено 22.08.2023 0:09 σ

Re[99]: Когда это наконец станет defined behavior?
σ>>И что «lifetime»? Он начинается внутри функции, после инициализации result.
BFE>Когда начинается lifetime объекта someDictionary ? Тогда, когда заканчивается конструирование объекта.

Ну. При NRVO, оно заканчивается на std::map<int, int> result;.

BFE>В выражении const std::map<int, int> someDictionary = buildMap(); вызов buildMap() sequenced before инициализации someDictionary, а значит значение для инициализации должно быть получено до начала lifetime объекта someDictionary. А до этих пор константный объект можно модифицировать.


Получается, result.insert(42, 43); — UB, т.к. после старта лайфтайма?
Re[99]: Когда это наконец станет defined behavior?
σ>>И что «lifetime»? Он начинается внутри функции, после инициализации result.
BFE>Когда начинается lifetime объекта someDictionary ? Тогда, когда заканчивается конструирование объекта.

Ну. При NRVO, оно заканчивается на std::map<int, int> result;.

BFE>В выражении const std::map<int, int> someDictionary = buildMap(); вызов buildMap() sequenced before инициализации someDictionary, а значит значение для инициализации должно быть получено до начала lifetime объекта someDictionary. А до этих пор константный объект можно модифицировать.


Получается, result.insert(42, 43); — UB, т.к. после старта лайфтайма?

Или объект сначала вроде как создаётся константным (const std::map<int, int> someDictionary), но потом становится неконстантным (std::map<int, int> result;), а опять константным не становится, и его можно менять даже после const std::map<int, int> someDictionary = buildMap();?