如果nullptr_t不是关键字,为什么char16_t和char32_t?

Bri*_*ian 39 c++ c++11

正如为什么nullptr_t不是关键字所讨论的那样,最好避免引入新关键字,因为它们可能会破坏向后兼容性.

为什么然后是char16_tchar32_t关键词,当他们可以这样定义?

namespace std {
    typedef decltype(u'q') char16_t;
    typedef decltype(U'q') char32_t;
}
Run Code Online (Sandbox Code Playgroud)

use*_*267 25

该提案本身解释了原因:允许与基础类型的超载uint_least16_tuint_least32_t.如果他们被typedef编辑,这是不可能的.

定义char16_t为一个独特的新类型,具有相同的大小和表示uint_least16_t.同样,定义char32_t为一个独特的新类型,具有相同的大小和表示uint_least32_t.

[N1040定义char16_tchar32_t作为类型定义到uint_least16_tuint_least32_t,使过载上这些字符是不可能的.]

至于它们不在std命名空间中的原因,这是为了与原始C提议兼容.C++禁止C定义出现在自己的版本中<cuchar>

[c.strings]/3

标头不得定义类型char16_t,char32_twchar_t(2.11).

然后,类型需要是全局typedef,它带有自己的一组问题,例如

typedef decltype(u'q') char16_t;

namespace foo {
  typedef int char16_t;
}
Run Code Online (Sandbox Code Playgroud)

std::nullptr_t在您关联的问题中可以找到不是关键字的原因

我们不希望nullptr_t在实际程序中看到多少直接使用.

nullptr_t在这里做出真正的例外.

  • 我在问题中提出的typedef方法避免了这个缺陷:它们可以是不同的类型,但仍然是typedef,与`decltype(nullptr)`的方式相同. (5认同)