Gostaria apenas de adicionar um pouco mais de detalhes. Uma matriz subjacente de std::initializer_list
comportamentos se comporta da mesma forma que os temporários. Considere a seguinte classe:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
e seu uso no seguinte código:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Imprime
ctor
dtor
barrier
desde que na primeira linha, uma instância temporária do tipo X
é criada (convertendo o construtor de 1
) e destruída também. A referência armazenada p
é então pendente.
Quanto a std::initializer_list
, se você usá-lo desta maneira:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
então, a matriz subjacente (temporária) existe enquanto l
sair. Portanto, a saída é:
ctor
ctor
barrier
dtor
dtor
No entanto, se você mudar para
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
A saída é novamente
ctor
dtor
barrier
já que a matriz (temporária) subjacente existe apenas na primeira linha. A desreferenciação do ponteiro para os elementos do l
resultado resulta em um comportamento indefinido.
A demonstração ao vivo está aqui .
std::pair
.