2013-03-08 8 views
5

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.

+0

Perché pensi che è restringimento? –

+3

Il restringimento verrebbe da 'float' a' int' –

+0

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

risposta

10

Le regole sono in 8.5.4 p7 che esclude il tuo esempio

da un tipo intero o tipo di enumerazione senza ambito di una virgola mobile tipo, se la sorgente è un'espressione costante e il valore effettivo dopo la conversione si inserisce nel ty bersaglio pe e produrrà il valore originale quando viene convertito al tipo originale, o & hellip;

(sottolineatura mia)

+0

Buona scoperta e grazie per il riferimento. Non ero consapevole che le espressioni costanti fossero trattate in modo diverso. –

+0

+1 in altre parole, non ci può essere alcuna perdita di informazioni –

+0

Qualche idea sul motivo per cui il mio ultimo esempio produce un errore di restringimento? –

7

Non vedo perché questo dovrebbe essere un errore dato che tutti e tre i numeri interi possono essere esattamente rappresentati come float.

Detto questo, posso ottenere g++ per darmi un avvertimento se includo una costante che non rientra in un float:

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing] 
Problemi correlati