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_test 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 passernullptrpour sélectionner la version du pointeur. En passantNULLou0, on sélectionnerait de façon confuse la versionint. -
, Un casting de
nullptr_tpour 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_castne peut pas convertirnullptr_ten 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) { }