所以我的理解是,公共初始值设定项列表值在包含初始值设定项列表的范围内定义,其生命周期以封闭初始值设定项列表结束
您正在谈论由纯右值表达式创建的对象{1, 2, 3}
, right?
有一个例子decl.init.list/6 http://eel.is/c++draft/dcl.init.list#6,
该数组与任何其他临时对象具有相同的生命周期([类.临时的 http://eel.is/c++draft/class.temporary]),除了初始化一个initializer_list
数组中的对象延长了数组的生命周期,就像将引用绑定到临时对象一样。 [Example:
// ...
std::initializer_list<int> i3 = { 1, 2, 3 };
// ...
其中标准(或草案)说
For i3
, the initializer_list
对象是一个变量,因此该数组在变量的生命周期内持续存在。
这表明该对象必须被具体化并且应该延长其生命周期。
然而,你是not初始化initializer_list
表达式中的对象,因为您的变量已经初始化。如果我们将您的代码重写为对名义上的调用
module_options.operator=({1, 2, 3})
那么我们就不会期望临时生命周期会延长到函数调用结束之后。
我怀疑临时变量仍然会存在到完整表达式的末尾,因为我认为绑定对的引用应该是extend它的寿命而不是减少它:但不可否认类.临时/6 http://eel.is/c++draft/class.temporary#6 says “...在引用的生命周期内持续存在...”并不是“……坚持不懈at least一生……”
但是,这确实意味着原始代码的以下变体应该可以满足您的要求:
std::map<int, std::vector<int>> ex = []{
/* for reused lists */
std::initializer_list<int> module_options { 1, 2, 3 };
return (decltype(ex)) {
{1, module_options},
{2, module_options},
};
}();