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
?
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 typestd::nullptr_t
est une constante de pointeur nulle, et qu'une constante de pointeur nulle intégrale peut être convertie enstd::nullptr_t
. La direction opposée n'est pas autorisé. Cela permet de surcharger une fonction pour les pointeurs et les entiers, et de passernullptr
pour sélectionner la version du pointeur. En passantNULL
ou0
, on sélectionnerait de façon confuse la versionint
. -
, Un casting de
nullptr_t
pour un type intégral a besoin d'unreinterpret_cast
, et a la même sémantique qu'un moulage de(void*)0
à un type intégral (implémentation de mappage définie). Unreinterpret_cast
ne peut pas convertirnullptr_t
en n'importe quel type de pointeur. Utilisez la conversion implicite si possible ou utilisezstatic_cast
. -
la norme exige que
sizeof(nullptr_t)
soitsizeof(void*)
.
à 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:
- WikiBooks , avec code échantillon.
- ici à Stack Overflow: utilisez-vous NULL ou 0 (zéro) pour les pointeurs en C++?
-
template
- Google group: comps.lang.C.++modéré - compilateur discussion
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) { }