Re[84]: Когда это наконец станет defined behavior?
От: vdimas Россия  
Дата: 18.08.23 08:13
Оценка:
Здравствуйте, σ, Вы писали:

V>>Результат начинает свой лайфтайм после возврата из хелпера-инициализатора.

σ>Т.е. внутри buildMap result обозначает объект вне лайфтайма? Значит на нём нельзя вызывать методы.

Забавные рассуждения, однако. ))
(у меня там были описки, исправил исходный пример http://www.rsdn.org/forum/cpp/8581544.1)

Переменная result внутри метода имеет свой лайфтайм, не связанный с оным у переменной someDictionary.
Что касается оптимизации возвращаемого значения — это низкоуровневая механика компилятора, ничего не меняющая в семантике исходного кода (если конструктор/деструктор без побочных эффектов).

На проблемы тут можно нарваться только в динамической фазе инициализации глобальных переменных, если переменная someDictionary глобальная и кто-то её юзает до инициализации или умудрился создать в коде динамической инициализации еще один поток и оттуда юзает эту переменную одновременно с наполнением её данными из основного потока.
(после инициализации иммутабельного someDictionary к нему безопасно обращаться из разных потоков без блокировки)

Главное то, что упомянутые бока могут возникнуть даже для классического полностью иммутабельного объекта, инициализирующего все свои поля в конструкторе, т.е. указанный трюк не добавляет никаких новых эффектов к ошибкам, связанным с использованием глобальных неинициализированных переменных.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.