mol*_*bel 5 c++ language-lawyer
具体来说,考虑以下代码:
uint8_t my_array[3] = { 1, 2, 3 };
uint8_t *my_array_a = my_array;
uint8_t *my_array_b = nullptr;
uint8_t *my_element1 = &my_array_a[0];
uint8_t *my_element2 = &my_array_b[0];
Run Code Online (Sandbox Code Playgroud)
请注意,这些类型都没有什么特殊之处operator&。operator*
如果这是 C,则标准保证my_array_b + 0在计算期间不会取消引用my_element2(来自 ISO/IEC 9899:TC2,运算符的语义&):
类似地,如果操作数是运算符的结果
[],则不会计算运算符或the 隐含的&一元,结果就像删除了运算符并将 the更改为运算符一样。*[]&[]+
C++ 标准是否提供类似的保证(至少对于给定的场景),或者以my_element2这种方式进行计算在技术上是未定义的行为,因为它涉及取消引用nullptr?
据我所知,上面的代码片段中没有隐藏的 UB。强制转换nullptrtouint8_t*是合法的,并且nullptr + 0被明确定义为 Yieling nullptr。诚然,这个样本也不是很有用,但无论如何我们都是在做规则律师。
这个问题类似于通过下标获取最后一位数组元素的地址:C++标准是否合法?,但我特别感兴趣的是 C++ 中是否也存在&[]->+转换或类似的保证。本文中的示例具体不执行任何越界索引,但仍可能包含 UB,具体取决于解除引用是否实际发生。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |