在C++标准中,哪里写明了sizeof(wchar_t) <= sizeof(long)和sizeof(bool) <= sizeof(long)?

4
在他的新书《C++程序设计语言》第四版的第149页上,Stroustrup先生写道:
1 <= sizeof(wchar_t) <= sizeof(long)

我无法在标准中找到支持上述最后一个不等式的任何内容。对于sizeof(bool) <= sizeof(long),我也可以说同样的话。 编辑:在3.9.1p5中,您会发现:

wchar_t类型应具有与其他整数类型之一(称为其基础类型)相同的大小,符号和对齐要求(3.11)。

这为该不等式提供了支持。
sizeof(wchar_t) <= sizeof(long long)

但不包括

sizeof(wchar_t) <= sizeof(long)

但我找不到任何证实的内容

sizeof(bool) <= sizeof(long)

1
sizeof(bool) <= sizeof(long) 可能是由 [conv.rank]/1 指定的保证: "bool 的 rank 应该小于所有其他标准整数类型的 rank"。(尽管 "rank" 不严格意味着 "size")。 - dyp
一个扩展整数类型也是一种整数类型;因此,如果您的实现有 int128_t,我认为3.9.1/5也允许 wchar_t 比64位的 long long 更大。 - dyp
1个回答

6
很难想象对于任何N的值,都有一个sizeof(wchar_t)>N && sizeof(long)<=N实现,更不用说有人会考虑使用wchar_t了。话虽如此:
事实上,我认为是错误的。4.5“整数提升”p2明确允许这种可能性:

2.类型为char16_t、char32_t或wchar_t(3.9.1)的prvalue可以转换为以下第一个类型的prvalue,该类型可以表示其基础类型的所有值:int、unsigned int、long int、unsigned long int、long long int或unsigned long long int。如果列表中没有任何类型可以表示其基础类型的所有值,则类型为char16_t、char32_t或wchar_t的prvalue可以转换为其基础类型的prvalue。

而5.3.3“sizeof”p1则明确将实际大小留给了实现定义:

1. [...] 应用于任何其他基本类型(3.9.1)的sizeof的结果是实现定义的[ *注意:特别是sizeof(bool)、sizeof(char16_t)、sizeof(char32_t)和sizeof(wchar_t)是实现定义的。*76—注] [注意:见1.7中字节的定义和3.9中对象表示的定义。--end note]

虽然5.3.3足以使相对大小成为问题,但我认为wchar_t可能无法在任何标准类型中表示的规范可能性使其不容置疑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接