形成对对象的引用是否构成访问?

Does forming a reference to an object constitute access?

本文关键字:访问 是否 对象 引用      更新时间:2023-10-16

形成对对象的引用是否构成访问?

以下是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对正确类型的引用是允许且有效的。

[basic.compound]/3...指针类型的每个值都是以下值之一:

(3.1( — 指向对象或函数的指针(指针被称为指向对象或函数(,或

(3.2( — 经过对象末端的指针 (8.7(,或

(3.3( — 该类型的空指针值 (7.11(,或

(3.4( — 无效的指针值。


[expr.unary.op]/1一元*运算符执行间接寻址:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。

因此,表达式*ptr的含义仅针对指向对象或函数的指针ptr定义,即其值位于[basic.compound]/(3.1(下的指针。在所有其他情况下,此表达式表现出未定义的行为。