2010-08-22 46 views
6

Ich habe versucht, den folgenden Code:G ++ 4.5 Bug: Keine Diagnose zur Verengung in Initialisiererliste

int main() 
{ 
    int x {23.22}; 
} 

, die eine Initialisierung enthält, die Verengung erfordert, aber der Code kompiliert ohne Fehler oder Warnung in Ordnung. Auf der anderen Seite gibt der folgende Code Fehler:

int main() 
{ 
    int x[]{23.22}; 
} 

Habe ich einen Fehler gefunden oder was?

PS: Ich bin derzeit mit GCC 4.5.0

+0

Beide scheinen für C++ 98 – Chubsdad

+3

schlecht gebildet zu sein Ich spreche über C++ 0x –

Antwort

7

Sieht aus wie ein Bug. Das Folgende ist gerade aus dem Entwurf n3092:

8.5.4 List-initialization

— Otherwise, if the initializer list has a single element, the object is initialized from that element; if a narrowing conversion (see below) is required to convert the element to T, the program is ill-formed.

int x1 {2}; // OK 
int x2 {2.0}; // error: narrowing 

Sie einen Blick auf GCC C nehmen ++ 0X Compliance here. Der Status des Initializer Lists (N2672) 'Ja' - aber beachten Sie, dass Dies ist nur experimentell (und daher können Sie Fehler erwarten).

Update von bug report: GCC gibt eine Warnung mit dem -Wconversion Flag aus (und nein, dies wird nicht von -Wall abgedeckt).

+1

Ich weiß über das Feature, aber es erwähnt auch, dass, wenn es eine Möglichkeit der Eingrenzung auftreten, die Initialisierung sollte scheitern, nicht wahr? –

+0

Die Tabelle listet implementierte Features auf, aber nicht welche Features gut implementiert sind. Version 4.4.1 scheint ziemlich schlecht mit der neuen Initialisierungssyntax und den Initialisierungslisten zu kämpfen, nicht sicher, ob es besser ist mit 4.5 – UncleBens

+0

@UncleBens: Dies sind experimentelle Builds; Ich würde von diesen Builds keine Top-Qualität erwarten. – dirkgently

0

Da C++ 0x-Unterstützung immer noch implementiert wird, auch wenn es einen Fehler oder eine Warnung nach dem Standard geben sollte und es nicht gibt, macht das nicht unbedingt einen Bug, der noch implementiert werden muss. Dies kann auch auftreten, wenn der Entwurf des Standards geändert wurde, seit dieses spezielle Feature implementiert wurde.

Die Tatsache, mit Work-in-Progress-Software oder Standards zu arbeiten, ist, dass Dinge, die nach der neuesten Spezifikation existieren sollen, nicht existieren.