2011-07-12 1 views
4

Possible Duplicate:
What exactly is nullptr?Est-ce que nullptr n'est pas un mot-clé spécial et un objet de std :: nullptr_t?

J'ai d'abord pensé que c'était un mot-clé. Mon gcc actuel ne met pas en évidence nullptr dans une nuance différente. Pour vérifier que, j'ai écrit ce qui suit:

void *&p = nullptr; 

alors je suis un peu la moindre idée de l'erreur:

error: invalid initialization of non-const reference of type ‘void*&’ from an rvalue of type ‘std::nullptr_t’

Si nullptr est un objet alors est-il vraiment un équivalent pointeur de simples 0? En d'autres termes, supposons que j'écris:

#define NULL nullptr 

L'instruction ci-dessus ne modifie rien dans mon code? Aussi, il serait intéressant de connaître d'autres cas d'utilisation pour le type std::nullptr_t en tant que tel.

+0

gcc ne highlight' pas ==> 'éditeur vim ne met pas en gcc' :) – iammilind

+2

Votre gcc ne va pas "highlight"' nullptr'. gcc est un compilateur; la seule présentation du compilateur est l'erreur et les avertissements qui résultent de la compilation; J'espère qu'il n'y en a pas. C'est votre éditeur qui va mettre en évidence nullptr. Cela ne devrait pas être si surprenant que votre éditeur ne soit pas à la hauteur de la nouvelle norme car la nouvelle norme n'existe pas encore, du moins pas officiellement. C'est pourquoi il est encore appelé C++ 0x plutôt que C++ 11. –

+2

Voir [Qu'est-ce que nullptr en C++ 0x?] (Http://stackoverflow.com/questions/1282295/what-exactly-is-nullptr-in-c0x/1282345#1282345). Certaines de vos questions y sont répondues. – eran

Répondre

10

Il est un mot-clé, le projet de norme dit (lex.nullptr):

The pointer literal is the keyword nullptr. It is a prvalue of type std::nullptr_t.

le nullptr est pas encore pointeur, mais il peut être converti en un type de pointeur. Cela interdit votre affectation ci-dessus, qui est une affectation à un type de référence non lié, auquel cas aucune conversion n'est possible (considérez int& a = 1.f;!).

Faire #define NULL nullptr ne devrait pas modifier le comportement, sauf si vous avez utilisé NULL dans un contexte tel que celui int i = 4; if(NULL == i) {}, qui ne fonctionne pas avec nullptr car nullptr est ne peut pas être traité comme un littéral entier.

Je ne pense pas qu'il y ait beaucoup d'autres cas d'utilisation pour std::nullptr_t, c'est juste une sentinelle parce que nullptr a besoin d'un type.

+0

+1, bien que "ne devrait pas modifier le comportement à moins ..." - en d'autres termes, il casse (certaines) choses. 'NULL' est garanti avoir un type entier,' nullptr' ne l'est pas. –

+2

Il y a une petite utilisation pour 'nullptr_t'. Si vous avez plusieurs surcharges prenant différents types de pointeurs, le cast 'nullptr'-to-pointer sera ambigu. Vous pouvez utiliser une surcharge 'nullptr_t' pour désambiguïser l'appel. –

3

nullptr sera un mot-clé dans le prochain standard C++, maintenant appelé C++ 0x.

Il est nécessaire de désambiguïser entre f(int) et f(T*), donc ce n'est pas simplement 0, mais de nullptr_t.

Je ne savais pas gcc peut mettre en évidence le code ;-)

+0

Bonne prise pour le point culminant de gcc. C'était une erreur. – iammilind

6

nullptr est un mot clé représentant une constante de pointeur nulle. Il est de type nullptr_t, qui est implicitement convertible et comparable à n'importe quel type de pointeur ou de type pointeur à membre.

Lire ceux-ci,

4

nullptr est en effet un mot-clé et la norme exige un type std::nullptr_t équivalent à typedef decltype(nullptr) nullptr_t; à activer la surcharge basée sur nullptr.

3

nullptr n'est pas un objet comme 0 n'est pas un objet entier.Le premier est une prvalue (c'est-à-dire une sorte d'expression) de type std::nullptr_t et ce dernier est un littéral entier (également une sorte d'expression et également une prvalue) de type int.

Il est possible d'initialiser un objet avec de telles expressions:

void* p = nullptr; 
int i = 0; 

Il est impossible d'initialiser une référence lvalue avec ces expressions parce qu'ils sont prvalues; une référence lvalue ne peut être initialisée qu'à partir d'une lvalue.

void*& p = nullptr; // Invalid 
int& i = 0; // Invalid 
Questions connexes