std::string
ha un costruttore di modelli che costruisce una stringa da una coppia di iteratori inizio/fine. I letterali stringa in C++ passano a const char*
S. E i puntatori sono iteratori. Pertanto, l'inizializzazione dell'elenco ha selezionato il costruttore della coppia inizio/fine.
Hai ricevuto un errore di runtime perché i due puntatori non creano effettivamente un intervallo valido, che non può essere determinato in fase di compilazione (generalmente).
std::string
ha un sovraccarico del costruttore sotto forma di
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
e questo viene chiamato perché "str1"
e "str2"
decade a const char*
's e const char*
è un tipo di iteratore accettabile.
Si verifica un arresto anomalo perché l'"intervallo iteratore" passato alla funzione non è valido.
Che usano il costruttore con iteratori di std::string (6.).
template< class InputIt >
constexpr basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
Con [InputIt
=const char*
].
Quindi hai UB come intervallo {"str1", "str2"}
non è valido.