形成对对象的引用是否构成访问?
这是 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
? 如果单独来看,这个语句会是未定义的行为ptr == nullptr
吗?- 是的,空指针的间接寻址是 UB - https://stackoverflow.com/a/59205697/1614051
- 如果
ptr
指向除 之外的其他东西,是否会违反混叠int
?
请注意,我专门询问如何形成参考,而不是使用它来读取值。
编辑 09/12/2019:接受以下答案:
- 是否
int const volatile& ref = *ptr;
读取指向对象的值?- 不。
- 这是未定义的时间
ptr == nullptr
吗?- 是的,
*ptr
在空指针上是未定义的。
- 是的,
ptr
如果指向不同类型的对象, 形成引用是否违反了别名?- 不,只是形成引用并不违反严格的别名。
- 大概
reinterpret_cast
-ing 对正确类型的引用是允许且有效的。