g++
con -std=c++11
sembra accettarlo:Perché non vi è alcuna restrizione della conversione in questo codice, causando un errore?
#include <vector>
#include <initializer_list>
std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)?
int main() {}
sembrerebbe che la linea con il commento dovrebbe errore fuori, ma non è così.
Aggiornamento
Grazie a Jesse per punta alla standardese (8.5.4 p7) che definisce il motivo per cui questo è OK. Ecco alcuni esempi di codice che aiuta a chiarire il comportamento definito dalla norma:
const int v5=5;
int v6=6;
vector<double> vd1={1,2,3,4}; // OK
vector<double> vd2={1,2,3,4,v5}; // Still OK, v5 is const
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6
// is non-const
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on
// gcc 4.7.2, not sure why.
Spero che gli esempi che ho appena presentato potranno aiutare gli altri a superare alcuni problemi di restringimento quando si utilizzano gli elenchi di inizializzazione.
Se qualcuno sa perché l'ultimo caso viola la definizione standard, si prega di inviare un commento.
Perché pensi che è restringimento? –
Il restringimento verrebbe da 'float' a' int' –
Come viene ridotta la conversione? GCC [invia un avvertimento] (http://liveworkspace.org/code/1FWK1L$2) quando viene rilevato il restringimento, e puoi trasformarlo in errore [compilando con '-pedantic-errors'] (http: // liveworkspace.org/code/1FWK1L$1). – Praetorian