Стандарт гласит, что 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
? Я не в состоянии понять эти определения.
Внутренне существует сущность, которая является тип константы нулевого указателя. Это один из основных типов.
Ключевое слово, литерал и выражение 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
в качестве ключевых слов я бы предположил, что они недостаточно распространены, чтобы рисковать столкновением имен с определенным пользователем именем с таким же написанием. Напомним, что такое столкновение будет происходить во всех без исключения областях.
Это зависит от реализации. Важно то, что (стр. 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
).