2016-07-10 32 views
6

Guardando l'attuazione di nullptrhere, ciò che ha ottenuto la mia attenzione è che nullptr è rvalue che significa che possiamo fare qualcosa di simileCome è rvalue nullptr

std::nullptr_t&& nullref = nullptr; 

Ma come potevamo nullptr essere rvalue dal momento che le implementazioni è qualcosa di simile

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

È questa caratteristica fondamentale? Cosa mi manca?

+5

_Every_ keyword è una "feature principale". –

+1

È proprio come "questo". –

risposta

14

L'implementazione non ha nulla a che fare con questo.

La parola chiave nullptr è definita per produrre un'espressione rvalue, e questa è la sua fine.

[C++14: 2.14.7/1]: il letterale del puntatore è la parola chiave nullptr. È un valore di tipo std::nullptr_t. [Nota:std::nullptr_t è un tipo distinto che non è né un tipo di puntatore né un puntatore al tipo di membro; piuttosto, un valore di questo tipo è una costante di puntatore nullo e può essere convertito in un valore di puntatore nullo o un valore di puntatore membro nullo. Vedi 4.10 e 4.11. -end nota]

sono d'accordo non si poteva te reimplementare a tale criterio in userspace, ma poi questo è il caso per ogni singola altra parola chiave anche.

Le espressioni che consistono solo delle parole chiave true e false sono anche rvalue, se siete curiosi.

[C++14: 2.14.6/1]: I letterali booleani sono le parole chiave false e true. Tali valori letterali sono prvalues ​​e hanno tipo bool.

4

Se l'alternativa n. 1 era la definizione di nullptr, allora hai ragione che sarebbe un lvalue. Tuttavia, potrebbe essere costretto ad essere un rvalue utilizzando qualcosa di simile a questo:

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

Questo non è ciò che è stato in ultima analisi standardizzata però. Nel C++ 11 attuale, nullptr è un valore letterale, allo stesso modo di 3.14 o 'x'.