我想再补充一些细节。一个std::initializer_list
的基础数组的行为类似于临时变量。考虑以下类:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
以及其在以下代码中的使用:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
它会打印出
ctor
dtor
barrier
在第一行,临时的 X
类型实例被创建 (通过从 1
转换构造函数),同时也被销毁了。存储在 p
中的引用是悬挂的。
至于 std::initializer_list
,如果您这样使用它:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
因此,只要 l
存在,底层的(临时)数组就存在。因此,输出结果为:
ctor
ctor
barrier
dtor
dtor
然而,如果你切换到
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
输出结果再次出现
ctor
dtor
barrier
由于底层的(临时)数组仅存在于第一行。然后对 l
的元素进行解引用的指针将导致未定义的行为。
演示实例在 此处。
std::pair
。 - Max Langhof