2010-08-20 12 views
12

Ich habe versucht, den Code unten mit ClangHabe ich einen Fehler in Clang gefunden?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

Der obige Code einen Fehler nicht geben, zu kompilieren, wenn sie mit Clang.

[email protected] ~ $ clang++ --version 
clang version 2.8 (trunk 107611) 
Target: i386-pc-linux-gnu 
Thread model: posix 
[email protected] ~ $ cat bug.cpp 
class Prasoon{ 

     private: 
     static const int dummy = 0; 

    }; 

int const Prasoon::dummy = 0; 

int main(){} 
[email protected] ~ $ clang++ bug.cpp 
[email protected] ~ $ 

zusammengestellt Aber wenn ich den gleichen Code mit g++ zusammengestellt bekam ich einen Fehler wie erwartet.

[email protected] ~ $ g++ bug.cpp 
bug.cpp:8: error: duplicate initialization of ‘Prasoon::dummy’ 

Also habe ich einen Fehler in Clang gefunden?

+0

Welche Klangversion verwenden Sie? 1.5 auf Mac gibt die gleiche Ausgabe wie g ++ 4.2.1. – Eiko

+1

Das ist in seiner Beispielausgabe: clang Version 2.8 (trunk 107611) – Douglas

+2

Nun, es war nicht vor der Bearbeitung ;-) – Eiko

Antwort

9

Ja, Sie haben einen Fehler gefunden.

Die Regel in dem Standard ausgedrückt:

9.4.2-3: Wenn ein statisches Datenelement von const wörtlicher Art ist, ihre Erklärung in der Klassendefinition kann angeben, ein brace- or- equal-initializer, wobei jede Initialisierungsklausel, die ein Zuweisungsausdruck ist, eine konstante Formel ist. Ein statisches Datenelement des Literaltyps kann in der Klassendefinition mit dem Parameter consExpr deklariert werden; wenn ja, muss seine Deklaration einen Klammer-oder-Gleich-Initialisierer angeben, in dem jede Initialisierungsklausel, die ein Zuweisungsausdruck ist, ein konstanter Ausdruck ist. [Hinweis: In beiden Fällen kann das Element in Konstantenausdrücken erscheinen. - Endnote] Das Mitglied soll noch in einem Namespacebereich definiert werden, wenn es in dem Programm verwendet wird und die Namespace Umfang Definition stellt keinen initializer enthalten.

4

Ja, das ist in der Tat ein Fehler. Ich stolperte über Ihre bug report zu klingeln - Danke, dass Sie sich die Zeit genommen haben, es einzureichen :) Während dieser Bug am 23.04.10 zunächst als bug geloggt wurde, brachte mich Ihre Einreichung auf mich aufmerksam und ich habe eine einfache patch eingereicht die Entwicklergruppe für ihre Überprüfung.

Verwandte Themen