В чем разница между nullptr и nullptr_t в С++?

Какой из них я должен использовать? Какие-нибудь преимущества, если я использую один над другим?


person Moiz Sajid    schedule 24.06.2015    source источник
comment
nullptr_t является типом nullptr   -  person OMGtechy    schedule 24.06.2015
comment
nullptr и nullptr_t никогда не взаимозаменяемы. Вопрос не имеет смысла. Нет такого вопроса, как выбрать, какой из них использовать.   -  person AnT    schedule 24.06.2015
comment
Был очень хороший ответ на тот же вопрос, отправленный сегодня на Quora компанией Brain. Не уверен, что вы тот, кто спросил об этом, поскольку это кажется очень случайным.   -  person 0x499602D2    schedule 24.06.2015


Ответы (7)


nullptr — константа, nullptr_t — ее тип. Используйте каждый из них в контекстах, где вам нужен соответственно нулевой указатель или тип нулевого указателя.

person Quentin    schedule 24.06.2015

Точно так же, как true является литералом ключевого слова C++ типа bool, nullptr является литералом ключевого слова C++ типа std::nullptr_t.

person Julian McKinlay    schedule 24.06.2015

"... если я использую одно вместо другого?"

Вы не можете (использовать одно поверх другого), они ортогональны следующими способами:

nullptr_t — это тип, используемый для представления nullptr

nullptr (1)фактически является константой типа nullptr_t, которая представляет определенное значение, определенное реализацией компилятора.

См. стандарты C++11. раздел:

2.14.7 Литералы указателей

  1. Литерал указателя — это ключевое слово 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.

person Community    schedule 24.06.2015

nullptr относится к типу nullptr_t.

person Sam Estep    schedule 24.06.2015

Если вы попробуете это

cout << typeid(nullptr).name() << endl;

вы увидите, что nullptr имеет тип std::nullptr_t.

person Karlis Olte    schedule 24.06.2015

nullptr — это литерал указателя типа std::nullptr_t. И, кроме того, nullptr также является ключевым словом C++, как и булевы литералы false и true. :)

person Vlad from Moscow    schedule 24.06.2015

Из [lex.nullptr]:

Литералы указателя

литерал-указатель:
nullptr

Литерал указателя — это ключевое слово nullptr. Это значение типа std::nullptr_t. [Примечание: std::nullptr_t — это отдельный тип, который не является ни типом указателя, ни указателем на тип члена; скорее, значение prvalue этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение нулевого указателя-члена. См. 4.10 и 4.11. -конец примечания]

Поэтому используйте nullptr, когда вам нужен литерал указателя, и std::nullptr_t в контексте, когда вам нужно взять этот тип. Последнее, например, если вы создаете функцию или конструктор или что-то, что может принимать nullptr в качестве аргумента.

person Barry    schedule 24.06.2015