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.
Warum denken Sie, es verengt? –
Die Eingrenzung würde von "float" nach "int" erfolgen. –
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