Standard-argument, gcc vs clang
Code sieht wie folgt aus:
struct Foo {
Foo(const char *);
};
Foo::Foo(const char *str = 0)
{
}
VS 2013 und gcc 4.8.0 akzeptieren einen solchen code,
während clang 3.3 lehnen diesen code mit:
Fehler: neben der Standard-argument auf nochmaliges deklarieren einer macht dieser Konstruktor einen Standardkonstruktor
Recht wer vom standard (C++03 und C++11) point of view?
Hinweis:
Ich mag das Geräusch ist Wahl auch, aber ich werde berichten gcc und visual studio
und wenn dies nicht richtig von standard-Sicht, das hilft
überzeugen compiler-Entwickler, um dieses Problem zu beheben.
GCC
Ich das beschriebene Problem hier: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58194
Aber kein Glück, Sie auszusetzen, Fehler beheben, bis der Entwurf zum standard geworden.
- Das GERÄUSCH macht mehr Sinn. Sollten Sie die default-parameter im Konstruktor, in dem die Erklärung, nicht in seiner definition.
- Ohne einen Blick in die Spezifikation, ich würde behaupten, dass der Klang richtig ist. Überlegen Sie, was passieren würde, wenn Sie nicht haben, sowohl die Struktur und definition der Konstruktor-definition in der gleichen Datei (z.B. die normale Aufteilung in header und source-Dateien), dann wird nur die Quell-Datei mit der Konstruktor-definition würde das wissen, über das Standard-argument und keine anderen Benutzer der Struktur.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese wurde diskutiert über die Clang Mailingliste vorgelegt worden als Mangel Melden Core-Ausgabe 1344.
Aus der Mailingliste Diskussion:
TL;DR Clang ist richtig, wenn der Mangel wird behoben (nicht sicher, ob das offiziell nur zufällig mit C++14, oder wenn ein solcher Komitee-Entscheidungen können auch nachträglich auf C++11)
Ich würde sagen, das GERÄUSCH ist rechts. Der standard sagt (12.1.5 für die alten und neuen Versionen der standard):
Hinzufügen der Standard-Wert, um das einzige argument des Konstruktors definitiv macht es möglich, es zu nennen, ohne Argumente, so dass es eine Standard-Einstellung. Auch, 8.3.6 sagt (Hervorhebung von mir):
Haben Sie eine Deklaration und eine definition. In Ihrer Erklärung haben Sie nicht, einen Standardwert, während in Ihrer definition haben Sie einen default-Wert. In der Tat, die Unterschrift der Erklärung ist sehr ähnlich zu der Signatur der definition, aber nicht das gleiche. Ich glaube, dass strenge ist eine gute Idee, so glaube ich, dass es besser ist, zu erzwingen, dass die Deklaration ist die gleiche wie die definition.