C++自动将bool值设置为true或者false,即使该类型实际上包含1个字节的值.
这bool(123) == true是真的,有
int i = 123;
bool b = i;
int j = b;
Run Code Online (Sandbox Code Playgroud)
j取得价值1.
但是当reinterpret_cast与bool*指针一起使用时,情况仍然如此吗?例如
static_assert(sizeof(bool) == 1, "assuming sizeof(bool) is one in this example...");
std::uint8_t i = 123;
bool* b = reinterpret_cast<bool*>(&i);
int j = *b; // j becomes 1
if(*b == true) ... // condition is true
Run Code Online (Sandbox Code Playgroud)
这些结果是否保证是真实的,还是未定义的行为.(即可以依赖于bool对象已经在内部表示为1和的假设进行编译0).
来自[basic.lval]:
如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为是未定义的:
(10.1) - 对象的动态类型,
(10.2) - cv限定版本的对象的动态类型,
(10.3) - 与对象的动态类型类似的(如4.4中所定义)类型,
(10.4) - 对应于对象的动态类型的有符号或无符号类型的类型,
( 10.5) - 对应于对象动态类型的cv限定版本的有符号或无符号类型的类型,
(10.6) - 在其元素或非静态数据成员中包含上述类型之一的聚合或联合类型(递归地,包括子聚合或包含联合的元素或非静态数据成员),
(10.7) - 一种类型,它是对象动态类型的(可能是cv限定的)基类类型,
(10.8) - 一个char或unsigned char类型.
您正试图uint8_t通过类型的glvalue 访问a的存储值bool.这不符合这8个类别,因此行为未定义.
| 归档时间: |
|
| 查看次数: |
558 次 |
| 最近记录: |