Perché l'accesso a std::initializer_list
non ci consente di modificare il suo contenuto? È un grande svantaggio di std::initializer_list
quando lo si utilizza per lo scopo principale (per inizializzare un contenitore), dal momento che il suo utilizzo porta a un eccessivo lavoro di copia/costruzione copia, invece di costruzione-spostamento/assegnazione-spostamento.initializer_list natura immutabile porta a copia eccessiva
#include <initializer_list>
#include <iostream>
#include <vector>
#include <cstdlib>
struct A
{
A() = default;
A(A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A & operator = (A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }
A & operator = (A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }
};
int
main()
{
std::vector<A>{A{}, A{}, A{}};
return EXIT_SUCCESS;
}
Output (come previsto):
A::A(const A &)
A::A(const A &)
A::A(const A &)
Perché è il suo design così costretto?
Come posso dedurre '{A {}, A {}, A {}}' costruisce tutti i contenuti della lista di inizializzazione in -posto. – Orient
Inoltre è impossibile usare 'std :: initializer_list' per inizializzare i contenitori di oggetti non copiabili. – Orient