Подтвердить что ты не робот

Если nullptr_t не является ключевым словом, почему char16_t и char32_t?

Как обсуждалось в Почему nullptr_t не является ключевым словом, лучше избегать введения новых ключевых слов, поскольку они могут нарушить обратную совместимость.

Почему тогда ключевые слова char16_t и char32_t, если они так же точно определены?

namespace std {
    typedef decltype(u'q') char16_t;
    typedef decltype(U'q') char32_t;
}
4b9b3361

Ответ 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 реальное исключение здесь.

Ответ 2

Из-за непослушного кода:

typedef uint16_t char16_t;

extern char * strndup16to8 (const char16_t* s, size_t n);
extern size_t strnlen16to8 (const char16_t* s, size_t n);

Конечно, наличие компиляторов, совместимых с С++ 11, не исключает существования библиотек С++ 03 или множества систем или пользователей, использующих компиляторы/библиотеки С++ 03.

Если вам повезет, они сделают это:

#if __STDC_VERSION__ < 201112L && __cplusplus < 201103L
   typedef uint16_t char16_t;
#endif