42 votes

La macro NULL peut-elle être une nullptr ?

Selon le projet de norme N4713 (7.11/1) :

Une constante de pointeur nulle est un littéral entier (5.13.2) de valeur zéro ou une prvalue de type std::nullptr_t .

et 21.2.3/2 :

La macro NULL est une constante à pointeur nul définie par l'implémentation.

suivre cela NULL peut être définie comme suit nullptr . La même chose est mentionnée sur cppréférence :

#define NULL 0
//since C++11
#define NULL nullptr

Dans le même temps, la clause "Opérateurs additifs" stipule (8.5.6/7) :

Si la valeur 0 est ajouté ou soustrait à une valeur de pointeur nulle, le résultat est une valeur de pointeur nulle. Si deux valeurs sont soustraites, le résultat est égal à la valeur 0 converti au type std::ptrdiff_t .

Le code suivant devrait donc être valide :

0 + nullptr; 
nullptr - nullptr; 

mais en raison de l'absence d'opérateurs +/- pour les std::nullptr_t les le code n'est pas valide .

Y a-t-il quelque chose que je n'ai pas pris en compte ? NULL ne peut pas être définie comme nullptr ?

1 votes

Oui, c'est possible. [[[[[[[[[[

0 votes

"Y a-t-il quelque chose que je n'ai pas pris en compte", oui, que l'on peut ajouter 0 au 0 littéral.

8 votes

Pointeur nul valeur et le pointeur nul constante sont deux choses très différentes.

49voto

Baum mit Augen Points 3571

En nullptr est un pointeur nul constante il ne s'agit pas d'un pointeur nul valeur . Ce dernier est une valeur d'un certain type de pointeur, qui std::nullptr_t ne l'est pas.

Référence :

Une constante de pointeur nulle est un littéral entier (5.13.2) de valeur zéro ou une prvalue de type std::nullptr_t . Une constante de pointeur nul peut être convertie en un type de pointeur ; le résultat est la valeur de pointeur nul de ce type. a et se distingue de toute autre valeur de type pointeur d'objet ou pointeur de fonction. Une telle conversion est appelée une conversion de pointeur nul. [...]

7.11/1 dans N4659, souligner la mienne

Donc NULL peut en effet être nullptr sans fournir les opérateurs arithmétiques.

0 votes

@Cheersandhth.-Alf Il s'agit bien d'une valeur, mais la norme parle explicitement des valeurs de pointeurs nuls comme des valeurs de pointeurs. nullptr n'est pas un pointeur.

6 votes

@Cheersandhth.-Alf - Non, il mérite un up-vote car le texte standard traite valeur du pointeur nul en tant que terme, et pas seulement valeur . Et si vous voulez déterrer des rencontres passées, n'allez pas reprocher aux autres d'être devenus personnels.

0 votes

Toute constante est une valeur. Il n'y a tout simplement pas d'exigence que nullptr devrait soutenir l'addition. Cependant, les 0 prend en charge l'addition, et la norme décrit le résultat de l'ajout, au moment de la compilation, de 0 à 0 .

9voto

user2079303 Points 4916

nullptr est un littéral de pointeur nul, et bien que le résultat de la conversion de nullptr à un type de pointeur est la valeur nulle du pointeur, nullptr lui-même n'est pas de type pointeur, mais de type std::nullptr_t . L'arithmétique fonctionne si l'on convertit le nullptr à un type de pointeur :

0 + (int*)nullptr; 
(int*)nullptr - (int*)nullptr;

La macro NULL peut-elle être une nullptr ?

Oui, car nullptr est un littéral de pointeur nul.

Notez qu'avant C++11, toutes les valeurs littérales des pointeurs nuls en C++ étaient également des valeurs littérales d'entiers, d'où ce mauvais code : char c = NULL; travaillait dans le domaine de la pratique. Si les NULL est défini comme suit nullptr ce code ne fonctionne plus.

6voto

n.m. Points 30344

Pour l'addition, soit les deux opérandes sont de type arithmétique ou de type énumération non encadrée, soit l'un des opérandes est un pointeur sur un type d'objet entièrement défini et l'autre est de type intégral ou de type énumération non encadrée.

Pour la soustraction, l'une des conditions suivantes doit être remplie :
(2.1) les deux opérandes sont de type arithmétique ou de type énumération sans échelle ; ou
(2.2) les deux opérandes sont des pointeurs vers des versions cv-qualifiées ou cv-non qualifiées du même type d'objet entièrement défini ; ou
(2.3) l'opérande gauche est un pointeur sur un type d'objet complètement défini et l'opérande droit est de type intégral ou énumération non cadrée.

std::nullptr_t n'est rien de tout cela, d'où std::nullptr ne peuvent pas participer à des opérations additives.

Notez que toutes les valeurs de pointeur ne peuvent pas participer. Par exemple, les valeurs de pointeur de fonction et les valeurs de pointeur void ne peuvent pas participer, même si l'une ou l'autre peut être une valeur de pointeur nulle.

5voto

S.M. Points 7691

Le mot-clé nullptr désigne le littéral du pointeur. Il s'agit d'un prvalue de type std::nullptr_t . Il existe des conversions implicites de nullptr à une valeur de pointeur nulle de n'importe quel type de pointeur et de n'importe quel pointeur de type membre. nullptr lui-même n'est pas une valeur de pointeur ni un pointeur. Les opérations arithmétiques ne sont donc pas applicables aux nullptr .

0 votes

Le point 8.5.6/7 ne s'applique donc pas à nullptr parce qu'il ne s'agit pas d'un pointeur nul ? (j'ai supprimé ce commentaire après avoir lu la réponse de Baums et je l'ai reposté après avoir lu la discussion sous cette réponse ;)

0 votes

Si nullptr est de std::nullptr_t et non d'un type de pointeur, en quoi s'agit-il d'un littéral de pointeur ? Vous pouvez envisager de reformuler un peu pour être plus précis.

0 votes

@user463035818 Oui, vous avez raison. A prvalue ("pure" rvalue) est une rvalue qui n'est pas une xvalue . [Exemple : Le résultat de l'appel d'une fonction dont le type de retour n'est pas une référence est un prvalue ] - copié d'ici stackoverflow.com/questions/3601602/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X