对对象的引用构成访问吗?
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
-对正确类型的引用是允许和有效的。