Какой из них я должен использовать? Какие-нибудь преимущества, если я использую один над другим?
В чем разница между nullptr и nullptr_t в С++?
Ответы (7)
nullptr
— константа, nullptr_t
— ее тип. Используйте каждый из них в контекстах, где вам нужен соответственно нулевой указатель или тип нулевого указателя.
Точно так же, как true
является литералом ключевого слова C++ типа bool
, nullptr
является литералом ключевого слова C++ типа std::nullptr_t
.
"... если я использую одно вместо другого?"
Вы не можете (использовать одно поверх другого), они ортогональны следующими способами:
nullptr_t
— это тип, используемый для представления nullptr
nullptr
(1)фактически является константой типа nullptr_t
, которая представляет определенное значение, определенное реализацией компилятора.
См. стандарты C++11. раздел:
2.14.7 Литералы указателей
- Литерал указателя — это ключевое слово
nullptr
. Это prvalue типаstd::nullptr_t
.
[Примечание:std::nullptr_t
— это отдельный тип, который не является ни типом указателя, ни указателем на тип члена; скорее, значение prvalue этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение нулевого указателя-члена. См. 4.10 и 4.11. — примечание в конце]
1) Точно так же, как ключевое слово this
, nullptr
означает значение r, а не тип const
. Таким образом, decltype(nullptr)
может быть типом, отличным от const
. В Visual C++ 2015 и MinGW g++ 5.1 это не const
.
nullptr
относится к типу nullptr_t
.
Если вы попробуете это
cout << typeid(nullptr).name() << endl;
вы увидите, что nullptr имеет тип std::nullptr_t.
nullptr
— это литерал указателя типа std::nullptr_t
. И, кроме того, nullptr
также является ключевым словом C++, как и булевы литералы false и true. :)
Из [lex.nullptr]:
Литералы указателя
литерал-указатель:
nullptr
Литерал указателя — это ключевое слово
nullptr
. Это значение типаstd::nullptr_t
. [Примечание:std::nullptr_t
— это отдельный тип, который не является ни типом указателя, ни указателем на тип члена; скорее, значение prvalue этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение нулевого указателя-члена. См. 4.10 и 4.11. -конец примечания]
Поэтому используйте nullptr
, когда вам нужен литерал указателя, и std::nullptr_t
в контексте, когда вам нужно взять этот тип. Последнее, например, если вы создаете функцию или конструктор или что-то, что может принимать nullptr
в качестве аргумента.
nullptr_t
является типомnullptr
- person OMGtechy   schedule 24.06.2015nullptr
иnullptr_t
никогда не взаимозаменяемы. Вопрос не имеет смысла. Нет такого вопроса, как выбрать, какой из них использовать. - person AnT   schedule 24.06.2015