形成对对象的引用是否构成访问?
以下是 GCC 和 Clang 目前所做的事情:
void test(int const volatile* ptr) noexcept {
*ptr; // movl (%rdi), eax // Reads *ptr
[[maybe_unused]] int const volatile& ref = *ptr; // Does not read *ptr
}
我的问题具体是关于该声明
[[maybe_unused]] int const volatile& ref = *ptr;
- 根据抽象机的说法,这是否读取了所指向的对象的值
ptr
?
-
Would this statement, in isolation, be undefined behavior if ptr == nullptr
?
- 是的,空指针的间接寻址是 UB -https://stackoverflow.com/a/59205697/1614051 https://stackoverflow.com/a/59205697/1614051
- 如果是的话,这会是别名违规吗
ptr
指向除某个以外的其他东西int
?
请注意,我特别询问有关形成参考的问题,而不是使用它来读取值的问题。
编辑 09/12/2019:接受以下答案:
- Does
int const volatile& ref = *ptr;
read the value of the pointed-to object?
- Is this undefined when
ptr == nullptr
?
- Is forming the reference an aliasing violation if
ptr
points to an object of different type?
- 不,仅形成引用并不违反严格别名。
- 想必
reinterpret_cast
- 对正确类型的引用是允许的且有效的。
[碱性化合物]/3...指针类型的每个值都是以下之一:
(3.1) — 指向对象或函数的指针(该指针被称为指向对象或函数),或者
(3.2) — 超过对象末尾的指针 (8.7),或
(3.3) — 该类型的空指针值 (7.11),或者
(3.4) — 无效的指针值。
[expr.unary.op]/1一元*
操作员执行间接:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式所指向的对象或函数的左值。
因此,表达式的含义*ptr
仅为指针定义ptr
指向一个对象或函数 - 即,其值属于以下范围的指针[碱性化合物]/(3.1)。在所有其他情况下,此表达式表现出未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)