0-initialisierung von PODs und nicht PODs
-
Guten Morgen,
ich habe wegen der unzureichenden C++11 Unterstützung mal gcc (zusammen mit Code::Blocks) installiert.
Jetzt wird mir eine Zeile á la:
size_type i(size_type());
als Fehler angezeigt.
Wieso ist mir auch klar und das ich statt dessen
size_type i((size_type()));
oder auch
size_type i = size_type();
schreiben kann und dann so gar keine Fehler bekomme.Bisher dachte ich aber immer, dass in diesem Kontext nicht von einem Pointer auf eine Funktion ausgegangen wird; MSVC(10) scheint das auch zu wissen.
Was sagt der Standard?
Wie handhabt ihr das?Danke, bb
PS: Wen die Fehlermeldung interessiert:
error: default argument for template parameter for class enclosing 'typename TYPE NAMESPACE::VAR(typename TYPE (*)())'
-
Ich nehme mal an, du hast CodeBlocks mit MinGW?
Und was ist size_type? Das typedef aus den STL-Containern? Oder std::size_t?
Edit²: Hmmm...
-
Hacker schrieb:
Ich nehme mal an, du hast CodeBlocks mit MinGW?
Und was ist size_type? Das typedef aus den STL-Containern?Nein. Irgend ein Size-Type. Er ist gerade in Template-Code und will sich nicht festlegen müssen. Insbesondere will er nichtmal verlangen, daß er mit =0 gut initialisiert werden kann.
Sonst hätte er die Frage nicht, fürchte ich.
-
volkard schrieb:
Sonst hätte er die Frage nicht, fürchte ich.

@hacker: spielt aber keine rolle im übrigen.
-
unskilled schrieb:
Jetzt wird mir eine Zeile á la:
size_type i(size_type());
als Fehler angezeigt.Wieso? Ich sehe den Fehler nicht. Das ist doch eine 1a Deklaration einer Funktion i, die einen Funktionszeiger als Parameter bekommt und einen size_type-Wert zurück gibt…
(Stichwort: „most vexing parse“)
unskilled schrieb:
Was sagt der Standard?
Wie handhabt ihr das?Wenn man es als Funktionsdeklaration parsen kann, ist es eine Funktion. Ich ziehe, sofern möglich, die Kopierinitialisierung vor — also die Syntax mit dem Gleichheitszeichen. Klammern helfen aber auch.
unskilled schrieb:
PS: Wen die Fehlermeldung interessiert:
error: default argument for template parameter for class enclosing 'typename TYPE NAMESPACE::VAR(typename TYPE (*)())'In Deinem Code-Beispiel ist nichts von Templates zu sehen.
-
krümelkacker schrieb:
unskilled schrieb:
PS: Wen die Fehlermeldung interessiert:
error: default argument for template parameter for class enclosing 'typename TYPE NAMESPACE::VAR(typename TYPE (*)())'In Deinem Code-Beispiel ist nichts von Templates zu sehen.
spielt es denn wirklich eine rolle?
size_type ist natürlich ein (vom template-parameter) abhängiger typ:
typedef typename allocator_type::size_type size_type;bb
-
unskilled schrieb:
Was sagt der Standard?
Wie handhabt ihr das?size_type i(0);
um ehrlich zu sein :pWenn man es perfekt machen will, muss man wohl boost::value_initialized verwenden: http://www.boost.org/doc/libs/1_48_0/libs/utility/value_init.htm
Aber ich sehe das pragmatischer: wenn etwas ein Sizetype ist, dann muss er mit 0 als Initialisierung klar kommen.
-
Shade Of Mine schrieb:
Aber ich sehe das pragmatischer: wenn etwas ein Sizetype ist, dann muss er mit 0 als Initialisierung klar kommen.
es ging mir weniger um praktische vorzüge(wie geschwindigkeit oder allgemeingültigkeit, da ich das genau so sehe) als um ästethik.
hab jz überall die op= syntax genommen. find ich hübscher als 0
-
Shade Of Mine schrieb:
Aber ich sehe das pragmatischer: wenn etwas ein Sizetype ist, dann muss er mit 0 als Initialisierung klar kommen.
Nicht nur das, ich würde sogar verlangen, dass er sich wie ein built-in Integer Datentyp verhält.
-
unskilled schrieb:
hab jz überall die op= syntax genommen.
…wobei eine Kopierinitialisierung natürlich keine Zuweisung ist. </nur_klarstell>