Ответ 1
В самом предложении объясняется, почему: разрешить перегрузку с базовыми типами uint_least16_t
и uint_least32_t
. Если бы они были typedef
ed, это было бы невозможно.
Определите
char16_t
как отдельный новый тип, который имеет тот же размер и представление, что иuint_least16_t
. Аналогичным образом определитеchar32_t
как отдельный новый тип, который имеет тот же размер и представление, что иuint_least32_t
.[N1040 определил
char16_t
иchar32_t
как typedefs наuint_least16_t
иuint_least32_t
, что делает невозможным перегрузку этих символов.]
Что касается того, почему они не находятся в пространстве имен std
, это касается совместимости с исходным предложением C. С++ запрещает определение C в своей версии <cuchar>
[c.strings]/3
Заголовки не должны определять типы
char16_t
,char32_t
иwchar_t
(2.11).
Затем типы должны быть глобальными typedefs, которые имеют свой собственный набор проблем, таких как
typedef decltype(u'q') char16_t;
namespace foo {
typedef int char16_t;
}
Причина того, что std::nullptr_t
не является ключевым словом, можно найти в вопросе, который вы связали
Мы не ожидаем увидеть прямое использование
nullptr_t
в реальных программах.
делает nullptr_t
реальное исключение здесь.