Здравствуйте, σ, Вы писали:
V>>Результат начинает свой лайфтайм после возврата из хелпера-инициализатора.
σ>Т.е. внутри buildMap result обозначает объект вне лайфтайма? Значит на нём нельзя вызывать методы.
Забавные рассуждения, однако. ))
(у меня там были описки, исправил исходный пример
http://www.rsdn.org/forum/cpp/8581544.1)
Переменная result внутри метода имеет свой лайфтайм, не связанный с оным у переменной someDictionary.
Что касается оптимизации возвращаемого значения — это низкоуровневая механика компилятора, ничего не меняющая в семантике исходного кода (если конструктор/деструктор без побочных эффектов).
На проблемы тут можно нарваться только в динамической фазе инициализации глобальных переменных, если переменная someDictionary глобальная и кто-то её юзает до инициализации или умудрился создать в коде динамической инициализации еще один поток и оттуда юзает эту переменную одновременно с наполнением её данными из основного потока.
(после инициализации иммутабельного someDictionary к нему безопасно обращаться из разных потоков без блокировки)
Главное то, что упомянутые бока могут возникнуть даже для классического полностью иммутабельного объекта, инициализирующего все свои поля в конструкторе, т.е. указанный трюк не добавляет никаких новых эффектов к ошибкам, связанным с использованием глобальных неинициализированных переменных.