Il seguente codice non viene compilato in GCC 4.7.2 o 3.2 Clang:Impossibile copiare una std :: vector <std :: function <void()>> utilizzando l'inizializzazione uniforme. È corretto?
#include <vector>
#include <functional>
int main()
{
std::vector<std::function<void()>> a;
std::vector<std::function<void()>> b{a};
}
Il problema è che il compilatore cercherà di creare b utilizzando un initializer_list, quando chiaramente dovrebbe essere solo chiamando il costruttore di copia. Tuttavia questo sembra essere il comportamento desiderato perché lo standard dice che i costruttori di initializer_list dovrebbero avere la precedenza.
Questo codice funzionerebbe bene per altri std :: vector, ma per una funzione std :: il compilatore non può sapere se si desidera il costruttore initializer_list o un altro.
Non sembra che ci sia un modo per aggirarlo, e se questo è il caso, allora non si può mai usare l'inizializzazione uniforme nel codice di codice. Quale sarebbe una vergogna gigante.
Visual Studio (CTP di novembre 2012) non si lamenta di ciò. Ma il supporto di initializer_list non è molto buono lì al momento, quindi potrebbe essere un bug.
Grazie per la risposta. Il collegamento LWG 2132 parla in realtà di un problema simile ma diverso, così come è possibile risolvere anche questo problema. Significa che il problema verrà risolto solo per std :: function, non per altri tipi con costruttori basati su modelli. Penso che la mia nuova regola per l'inizializzazione uniforme sia "usarla ovunque sia possibile, tranne se l'oggetto ha un costruttore initializer_list, quindi usarlo solo se si vuole quel costruttore."Il che significa anche che non è possibile utilizzarlo in codice. –
Preferisco la regola" non scrivere modelli di costruttori non vincolati che consentono la conversione implicita da qualsiasi tipo. "Se non crei tipi come quelli allora hai vinto" t causano problemi a chi cerca di usare il tuo tipo con classi che hanno costruttori di inizializzatori: la libreria standard non ha seguito quella regola, ma è stata risolta per 'std :: function'. –