Je voudrais juste ajouter un peu plus de détails. Un tableau sous-jacent de std::initializer_list
se comporte de manière similaire aux temporaires. Considérez la classe suivante:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
et son utilisation dans le code suivant:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Il imprime
ctor
dtor
barrier
car à la première ligne, une instance temporaire de type X
est créée (en convertissant le constructeur à partir de 1
) et détruite également. La référence stockée dans p
est alors suspendue.
Quant à std::initializer_list
, si vous l'utilisez de cette façon:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
puis, le tableau sous-jacent (temporaire) existe tant qu'il existe l
. Par conséquent, la sortie est:
ctor
ctor
barrier
dtor
dtor
Cependant, si vous passez à
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
La sortie est à nouveau
ctor
dtor
barrier
puisque le tableau sous-jacent (temporaire) n'existe qu'à la première ligne. Déréférencer le pointeur sur les éléments de l
entraîne alors un comportement indéfini.
La démo en direct est ici .
std::pair
.