问题并不像看起来那么明显,而且我很难找到有关bool
标准中类型的更多信息.
根据C++ 11标准,与bool
类型相关的保证是什么:
true
和false
?b
设为类型bool
,断言是否(b == true) || (b == false)
成立?结构(false < true)
良好,是否成立?R. *_*des 42
bool
类型在§3.9.1,基本类型一节中描述.这里的相关内容是第6段的一句话:
类型的值
bool
是true
或false
.47
参考脚注47提供了一些有趣的附加信息:
47)使用
bool
本国际标准描述的方式中的值为"未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是也不true
是false
.
这只是标准对具有未定义行为的程序没有要求的直接结果.
除了bool
作为C++内存模型的结果适用于所有类型的隐式"至少一个字节"之外,没有大小要求.
也有在内部表示没有任何要求bool
的对象,然而,由于有关整体转换的要求(true
必须转换到1
和false
到0
),实现可能会倾向于选择相同的表示,true
和1
,和false
和0
,因为这使得这样的转换不必要.
Mik*_*our 25
存储:需要多少空间,忽略对齐?
实现定义,但实际上是一个字节.它通常不能更小,因为这是可能的最小对象大小.例外情况是:
std::vector<bool>
打包值,使每个值占一位; 但并不真正持有类型的对象bool
.其他类型(如std::bitset
)做类似的事情,但不要假装存储bool
.是否需要存储的值来表示
true
和false
?
没有; 只是要求,当转换为数字类型时,true
变为1并false
变为0.实际上,这意味着实现可能使用这些值; 虽然,在某些平台上,其他表示可能会更好.
取值:
b
设为类型的对象,bool
断言是否(b == true) || (b == false)
成立?
如果b
已初始化或分配有效值,则断言将成立.如果它没有被初始化,那么它可能不会成立; 但是如果使用未初始化的值,则无论如何都有未定义的行为.事实上,该标准包含一个特定的脚注(由C++ 11 3.9.1/6引用)警告:
47)以本国际标准描述的方式将bool值用作"未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假.
更新:问题不断增长:
结构
(false < true)
良好,是否成立?
是的,是的.操作数被提升为int
,给予0 < 1
,这是真的.
关于bool
我们从草案C++标准中看看5.3.3
Sizeof部分的大小,它说(强调我的):
sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1.应用于任何其他基本类型(3.9.1)的sizeof的结果是实现定义的.[注意:特别是,sizeof(bool),sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是实现定义的.74就要收注] [...]
关于bool
如果我们看一节3.9.1
基本类型第6段的价值,说:
bool类型的值为true或false.47
你还问:
取值:设b为bool类型的对象,断言(b == true)|| (b == false)举行?是(假<true)格式良好,是否成立?
第6段中的4.5
整体促销说明:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1.
因为操作数<
被提升int
然后(false < true)
保持假定b
正确初始化(你没有调用未定义的行为)然后(b == true) || (b == false)
也成立.
归档时间: |
|
查看次数: |
4102 次 |
最近记录: |