2013-03-08 4 views
5

g++ mit -std=c++11 scheint es zu akzeptieren:Warum gibt es in diesem Code keine einschränkende Konvertierung, was zu einem Fehler führt?

#include <vector> 
#include <initializer_list> 

std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)? 

int main() {} 

Es scheint, dass die Zeile mit dem Kommentar Fehler soll, aber es funktioniert nicht.

aktualisieren

Dank Jesse zu dem standardese zeigt (8.5.4 p7), deshalb definiert dies in Ordnung ist. Hier ist ein Beispielcode, der das Verhalten von der Norm definiert zu klären hilft:

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. 

Ich hoffe, dass die Beispiele, die ich gerade vorgestellt wird anderen helfen Vergangenheit einige Verengung Probleme zu bekommen, wenn initializer Listen verwenden.

Wenn jemand weiß, warum der letzte Fall die Standarddefinition verletzt, bitte posten Sie einen Kommentar.

+0

Warum denken Sie, es verengt? –

+3

Die Eingrenzung würde von "float" nach "int" erfolgen. –

+0

Wie wird diese Conversion eingeengt? GCC gibt [Warnung] (http://liveworkspace.org/code/1FWK1L$2) aus, wenn eine Eingrenzung erkannt wird, und Sie können dies zu einem Fehler machen, indem Sie [mit '-pedantic-errors' kompilieren] (http: // liveworkspace.org/code/1FWK1L$1). – Praetorian

Antwort

10

Die Regeln in 8.5.4 p7 sind, die Ihrem Beispiel schließt

aus einem integer-Typ oder unscoped Aufzählungstyp auf einen Typ Punkt-Floating, außer wenn die Quelle ein konstanter Ausdruck ist, und der tatsächliche Wert nach der Umwandlung in das Ziel ty paßt pe und wird den ursprünglichen Wert produzieren, wenn zurück zum ursprünglichen Typ oder & hellip;

(Hervorhebung von mir)

+0

Gut gefunden und danke für die Referenz. Ich war mir nicht bewusst, dass konstante Ausdrücke anders behandelt wurden. –

+0

+1 mit anderen Worten, es kann keinen Informationsverlust geben –

+0

Irgendeine Idee, warum mein letztes Beispiel einen Verschmälerungsfehler produziert? –

7

Ich sehe nicht, warum dies Fehler aus, da alle drei ganzen Zahlen genau als float dargestellt werden können.

Das heißt, ich g++ bekommen kann mir eine Warnung zu geben, wenn ich eine Konstante enthalten, die in einem float passt nicht:

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