2016-07-10 26 views
6

ist Während seiner Zeit bei der Umsetzung von nullptrhere, auf der Suche, was hätte meine Aufmerksamkeit ist, dass nullptrrvalue ist, was bedeutet, dass wir so etwas wie dieseWie nullptr rvalue

std::nullptr_t&& nullref = nullptr; 

Aber wie nullptrrvalue sein könnten tun können, da die Implementierungen etwas wie das

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

Ist dieses Kernmerkmal? Was vermisse ich ?

+5

_Every_ Schlüsselwort ist ein "Kernmerkmal". –

+1

Es ist wie 'this'. –

Antwort

14

Implementierung hat nichts damit zu tun.

Das Schlüsselwort nullptr ist definiert, um einen rvalue Ausdruck zu erzeugen, und das ist das Ende davon.

[C++14: 2.14.7/1]: Der Zeiger wörtliche ist das Schlüsselwort nullptr. Es ist ein Prvalue des Typs std::nullptr_t. [Hinweis:std::nullptr_t ist ein eindeutiger Typ, der weder ein Zeigertyp noch ein Zeiger auf Membertyp ist; Ein Prvalue dieses Typs ist vielmehr eine Nullzeigerkonstante und kann in einen Nullzeigerwert oder Nullelementzeigerwert umgewandelt werden. Siehe 4.10 und 4.11. das ist der Fall für jede einzelne andere Schlüsselwort -Ende note]

Ich bin damit einverstanden Sie könnten sich in User-Space auf dieses Kriterium nicht neu implementieren, dann aber auch.

Ausdrücke, die nur aus den Schlüsselwörtern true und false bestehen, sind ebenfalls rvalues, wenn Sie neugierig sind.

[C++14: 2.14.6/1]: Die Boolesche Literale sind die Schlüsselwörter false und true. Solche Literale sind Prvalues ​​und haben den Typ bool.

4

Wenn Alternative # 1 die Definition von nullptr wäre, dann haben Sie Recht, dass es ein Lvalue wäre. es könnte jedoch gezwungen sein, einen R-Wert unter Verwendung von so etwas zu sein:

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

Das ist nicht, was letztlich jedoch standardisiert wurde. In der tatsächlichen C++ 11, nullptr ist ein Literal, genauso wie 3.14 oder 'x'.