Vorrei solo aggiungere un po 'più di dettagli. Un array sottostante std::initializer_list
si comporta in modo simile ai provvisori. Considera la seguente classe:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
e il suo utilizzo nel seguente codice:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Si stampa
ctor
dtor
barrier
poiché nella prima riga, X
viene creata un'istanza temporanea di tipo (convertendo il costruttore da 1
) e distrutta. Il riferimento memorizzato p
è quindi penzolante.
Per quanto riguarda std::initializer_list
, se lo usi in questo modo:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
quindi, l'array sottostante (temporaneo) esiste fino a quando l
esce. Pertanto, l'output è:
ctor
ctor
barrier
dtor
dtor
Tuttavia, se si passa a
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
L'output è di nuovo
ctor
dtor
barrier
poiché l'array sottostante (temporaneo) esiste solo nella prima riga. Dereferenziare il puntatore agli elementi di l
allora comporta un comportamento indefinito.
La demo live è qui .
std::pair
.