Qu'est-ce que nullptr?

nous avons maintenant C++11 avec beaucoup de nouvelles fonctionnalités. Le nouveau nullptr est intéressant et déroutant (du moins pour moi).

Eh bien, plus besoin de la macro méchante NULL .

int* x = nullptr;
myclass* obj = nullptr;

pourtant, je ne comprends pas comment nullptr fonctionne. Par exemple, article de Wikipedia dit:

C++11 corrige ceci en introduisant un nouveau mot-clé à servir comme une constante de pointeur nulle: nullptr. Il est de type nullptr_t , qui est implicitement convertible et comparable à tout type de pointeur ou pointeur-à-Membre type. Il n'est pas implicitement convertible ou comparable aux types intégraux, à l'exception de bool.

Comment est-ce un mot clé et une instance d'un type?

aussi, Avez-vous un autre exemple (à côté de celui de Wikipedia) où nullptr est supérieur à ce bon vieux 0 ?

492
demandé sur Josh Lee 0000-00-00 00:00:00

4 réponses

Comment est-ce un mot clé et une instance d'un type?

Ce n'est pas surprenant. Les deux true et false sont des mots clés et en tant que littérales ils ont un type ( bool ). nullptr est un pointeur littéral de type std::nullptr_t , et c'est une valeur PR (vous ne pouvez pas prendre l'adresse de celui-ci en utilisant & ).

  • 4.10 à propos de pointer la conversion dit qu'une prvalue de type std::nullptr_t est une constante de pointeur nulle, et qu'une constante de pointeur nulle intégrale peut être convertie en std::nullptr_t . La direction opposée n'est pas autorisé. Cela permet de surcharger une fonction pour les pointeurs et les entiers, et de passer nullptr pour sélectionner la version du pointeur. En passant NULL ou 0 , on sélectionnerait de façon confuse la version int .

  • , Un casting de nullptr_t pour un type intégral a besoin d'un reinterpret_cast , et a la même sémantique qu'un moulage de (void*)0 à un type intégral (implémentation de mappage définie). Un reinterpret_cast ne peut pas convertir nullptr_t en n'importe quel type de pointeur. Utilisez la conversion implicite si possible ou utilisez static_cast .

  • la norme exige que sizeof(nullptr_t) soit sizeof(void*) .

360
répondu Johannes Schaub - litb 2012-11-25 04:21:04

à Partir de nullptr: Un coffre-fort et Clair Pointeur Null :

le nouveau mot-clé nullptr C++09 désigne une constante de valeur qui sert de pointeur universel littéral null, remplaçant la buggy et faiblement dactylographié littéral 0 et l'infâme Macro NULL. nullptr met ainsi fin à plus de 30 ans d'embarras, d'ambiguïté et de bogues. Les sections suivantes présentent l'installation nullptr et montrent comment il peut remédier aux maux de nul et 0.

autres références:

51
répondu nik 2017-05-23 11:47:31

quand vous avez une fonction qui peut recevoir des pointeurs vers plus d'un type, l'appeler avec NULL est ambigu. La façon dont cela fonctionne maintenant est très hacky en acceptant un int et en supposant que c'est NULL .

template <class T>
class ptr {
    T* p_;
    public:
        ptr(T* p) : p_(p) {}

        template <class U>
        ptr(U* u) : p_(dynamic_cast<T*>(u)) { }

        // Without this ptr<T> p(NULL) would be ambiguous
        ptr(int null) : p_(NULL)  { assert(null == NULL); }
};

Dans C++11 vous seriez en mesure de surcharge sur nullptr_t de sorte que ptr<T> p(42); serait une erreur de compilation plutôt qu'une exécution assert .

ptr(std::nullptr_t) : p_(nullptr)  {  }
33
répondu Motti 2018-01-10 07:28:27

Pourquoi nullptr en C++11? Quel est-il? Pourquoi NULL n'est-il pas suffisant?

c++ expert

13
répondu