2016-07-10 5 views
6

Tout en regardant la mise en œuvre de nullptrhere, ce qui a attiré mon attention est que nullptr est rvalue ce qui signifie que nous pouvons faire quelque chose comme çaComment est nullptr rvalue

std::nullptr_t&& nullref = nullptr; 

Mais comment pourrait-nullptr être rvalue puisque les mises en œuvre est quelque chose comme ça

const class {...} nullptr = {}; 

Est-ce que cette fonctionnalité de base? Qu'est-ce que je rate ?

+5

_Every_ mot-clé est une "caractéristique de base". –

+1

C'est comme 'this'. –

Répondre

14

La mise en œuvre n'a rien à voir avec cela.

Le mot-clé nullptr est défini pour produire une expression rvalue, et c'est la fin de celui-ci.

[C++14: 2.14.7/1]: Le pointeur littéral est le mot-clé nullptr. C'est une prvalue de type std::nullptr_t. [Note:std::nullptr_t est un type distinct qui n'est ni un type de pointeur ni un pointeur vers un type de membre; à la place, une prvalue de ce type est une constante de pointeur NULL et peut être convertie en une valeur de pointeur NULL ou une valeur de pointeur de membre NULL. Voir 4.10 et 4.11. -end ndlr]

Je vous ne pourriez pas vous réimplémentez d'accord à ce critère dans l'espace utilisateur, mais qui est le cas pour chaque autre mot-clé aussi.

Les expressions composées uniquement des mots-clés true et false sont également des valeurs, si vous êtes curieux.

[C++14: 2.14.6/1]: Les booléennes sont les mots-clés false et true. Ces littéraux sont prvalues ​​et ont le type bool.

4

Si la variante 1 était la définition de nullptr, alors vous avez raison que ce serait une lvalue. Toutefois, il pourrait être forcé d'être un rvalue en utilisant quelque chose comme ceci:

const class __nullptr_t {...} __nullptr = {}; 
#define nullptr (__nullptr_t(__nullptr)); 

Ce n'est pas ce qui a été finalement normalisé bien. En réalité C++ 11, nullptr est un littéral, de la même manière que 3.14 ou 'x'.