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

对对象的引用构成访问吗?

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,此语句是否孤立地成为未定义的行为?
  • 如果ptr指向int以外的其他东西,是否会导致混叠?

请注意,我专门询问有关形成引用的问题,而不是有关使用它来读取值的问题。

编辑09/12/2019:接受以下答案:

  • int const volatile& ref = *ptr;是否读取指向的对象的值?
    • 不。
  • ptr == nullptr时是否未定义?
    • 是的,未定义空指针上的*ptr
  • 如果ptr指向不同类型的对象,则形成引用是否违反别名?
    • 不,仅构成引用并不违反严格的别名。
    • 大概reinterpret_cast-对正确类型的引用是允许和有效的。
a371357330 回答:形成对对象的引用是否构成访问?

  

[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)。在所有其他情况下,此表达式都表现出不确定的行为。

本文链接:https://www.f2er.com/2966091.html

大家都在问