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 :p

    Wenn 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>


Anmelden zum Antworten