Warum nochmal nullptr?



  • Ich steh gerade voll auf dem Schlauch. Warum ist nullptr nicht nochmal einfach sowas hier?

    struct nullptr_t
    {
        template <typename T>
        operator T* ()
        {
            return 0;
        }
    } nullptr;
    


  • Weil es dann nur verfügbar wäre, wenn du die entsprechenden Header einbindest.
    Ausserdem sollen so die Fehlermeldungen aussagekräftiger werden können.

    Es gibt aber ein std::nullptr_t , der ist allerdings aus dem Schlüsselwort nullptr abgeleitet und nicht umgekehrt.



  • Schau dir mal die Semantik von reinterpret_cast<XYZ>(nullptr) an, da wird dir klar, dass das nicht so einfach geht 😉



  • Also gut.

    struct nullptr_t
    {
        template <typename T>
        operator T* () const
        {
            return 0;
        }
    
        void const* const __ptr = 0;
    } const nullptr;
    

    Und jetzt? 🤡



  • schlaucherl schrieb:

    Weil es dann nur verfügbar wäre, wenn du die entsprechenden Header einbindest.
    Ausserdem sollen so die Fehlermeldungen aussagekräftiger werden können.

    Es gibt aber ein std::nullptr_t , der ist allerdings aus dem Schlüsselwort nullptr abgeleitet und nicht umgekehrt.

    new muss auch nicht eingebunden werden, kann aber.



  • Ethon schrieb:

    schlaucherl schrieb:

    Weil es dann nur verfügbar wäre, wenn du die entsprechenden Header einbindest.
    Ausserdem sollen so die Fehlermeldungen aussagekräftiger werden können.

    Es gibt aber ein std::nullptr_t , der ist allerdings aus dem Schlüsselwort nullptr abgeleitet und nicht umgekehrt.

    new muss auch nicht eingebunden werden, kann aber.

    Du meinst den Operator - den globalen. Jaja.

    Andererseits könnte man ein equivalent hinkriegen, 😃 😃 werd gleich mal einen Hack mit Haufenweise undefiniertem Verhalten basteln 🤡



  • @Kellerautomat
    Ich vermute mal wegen Overload-Resolution? nullptr sollte immer direkt für Zeiger passen, mit der nullptr_struct gäbe es eine userdefinierte Konvertierung, und wenn ich mich recht erinnere wird das als schlechter gewertet also ohne Konvertierung.

    Und als Non-Type Template Argument funktioniert deine nullptr struct auch net, der echte nullptr sollte dagegen mMn. gehen.



  • Ah richtig, das stimmt natürlich. Darauf bin ich jetzt auf die Schnelle nicht gekommen. 👍


Anmelden zum Antworten