Какой тип nullptr?

Стандарт гласит, что nullptr является литералом-указателем типа std::nullptr_t (2.14.7). А 18.2p9 определяет nullptr_t от

namespace std {
typedef decltype(nullptr) nullptr_t;
}

По 7.1.6.2p4 decltype(nullptr) тип выражения nullptrчто по определению std::nullptr_t (так как выражение nullptr это prvalue). Подставляя это в определение nullptr_t результаты в

typedef nullptr_t nullptr_t

С другой стороны, спецификатор typedef не вводит новый тип, это просто имя для другого существующего типа. Итак, что именно nullptr_t? Я не в состоянии понять эти определения.

7

Решение

Внутренне существует сущность, которая является тип константы нулевого указателя. Это один из основных типов.

Ключевое слово, литерал и выражение nullptr имеет этот тип. decltype(nullptr) относится к этому типу.

Тем не менее название std::nullptr_t не является ключевым словом (даже контекстно-зависимым), поэтому имя не существует, пока не объявлено. Если вы ссылаетесь на имя std::nullptr_t без объявления, это ошибка, как и для любого необъявленного имени.

Так что хотя тип существует в начале перевода, как и любой основной тип, название не существует.

На самом деле есть и другие фундаментальные типы, которые не имеют «одного правописания», например short int. Короткое int можно назвать как short, short int, signed short int, signed shortили любая их перестановка.

Это также не отличается от отношений между typeid оператор (ключевое слово) и тип typeid(...) выражение, std::typeinfo, typeinfo также не является ключевым словом, и имя не существует до объявления.

В основном вы смешиваете юридическое лицо (тип константы нулевого указателя) с название (std::nullptr_t)

Если вы спросите, почему разработчики языка не указали nullptr_t а также typeinfo в качестве ключевых слов я бы предположил, что они недостаточно распространены, чтобы рисковать столкновением имен с определенным пользователем именем с таким же написанием. Напомним, что такое столкновение будет происходить во всех без исключения областях.

3

Другие решения

Это зависит от реализации. Важно то, что (стр. 18.2 / 9 стандарта C ++ 11):

[…] Тип для которого nullptr_t является синонимом, имеет характеристики, описанные в 3.9.1 и 4.10. […]

Пока он ведет себя так, как указано в стандарте в этих двух параграфах, это может быть что угодно.

Я считаю, что логическая ошибка в вашем аргументе заключается в том, что это:

По 7.1.6.2p4 decltype(nullptr) тип выражения nullptrчто по определению std::nullptr_t (так как выражение nullptr это prvalue)

Есть ли не значит что nullptr_t является не псевдоним типа. Например, если я определю:

typedef decltype(42) foo;

Я могу сказать, что тип выражения:

42

Является foo, Еще, foo это просто псевдоним для другого типа (int).

6

По вопросам рекламы [email protected]