web-dev-qa-db-fra.com

Quel fichier d'en-tête doit être inclus pour utiliser NullPtr dans g ++?

J'utilise g ++ 4.4.1 et je veux utiliser nullptr, mais je ne suis pas en mesure de trouver quel fichier d'en-tête doit être inclus. Il ne semble pas être mot clé non plus, car ma tentative d'utilisation est rejetée comme

error: 'nullptr' was not declared in this scope
23
Arun

GCC 4.4.1 ne prend pas en charge nullptr.

Prise en charge de nullptr a été ajouté dans GCC 4.6.0: http://gcc.gnu.org/gcc-4.6/changes.html

Prise en charge expérimentale améliorée pour le prochain standard C++ 0x ISO C++, , y compris la prise en charge de NullPTR (grâce à Magnus Fromreide), noExcept, des syndicats sans restriction, Basé pour les boucles (grâce à Rodrigo Rivas Costa), des fonctions implicitement supprimées et des constructeurs de déplacement implicites.

Pour les versions antérieures de GCC, si vous souhaitez expérimenter avec nullptr, vous pouvez essayer la solution de contournement dans ce SO Question:

NullPtr peut-il être émulé dans GCC?

21
ZoogieZork

Je recommanderais pas d'utiliser nullptr tel que défini ci-dessus, car cela peut être dangereux. Si vous souhaitez utiliser nullptr, la déclaration suivante doit être vraie.

sizeof(nullptr) == sizeof(void*) == sizeof(any pointer)

Cependant, sizeof(nullptr) (tel que défini ci-dessus) ne se conformera pas à cette règle. Il évaluera réellement à sizeof(bad nullptr) = 1.

Ceci est une mise en œuvre correcte.

#pragma once

namespace std
{
    //based on SC22/WG21/N2431 = J16/07-0301
    struct nullptr_t
    {
        template<typename any> operator any * () const
    {
        return 0;
    }
    template<class any, typename T> operator T any:: * () const
    {
        return 0;
    }

#ifdef _MSC_VER
    struct pad {};
    pad __[sizeof(void*)/sizeof(pad)];
#else
    char __[sizeof(void*)];
#endif
private:
    //  nullptr_t();// {}
    //  nullptr_t(const nullptr_t&);
    //  void operator = (const nullptr_t&);
    void operator &() const;
    template<typename any> void operator +(any) const
    {
        /*I Love MSVC 2005!*/
    }
    template<typename any> void operator -(any) const
    {
        /*I Love MSVC 2005!*/
    }
    };
static const nullptr_t __nullptr = {};
}

#ifndef nullptr
#define nullptr std::__nullptr
#endif
3
Yaroslav

Si vous n'avez pas le dernier GCC qui prend en charge C++ 11, essayez d'utiliser NULL au lieu de NullPtr.

2
lppier

J'utilise -std = C++ 0x pour activer la fonctionnalité NullPtr avec GCC 4.6.3

2
xsj0jsx