gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:40:38 24 4
gpt4 key购买 nike

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

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

最佳答案

[basic.compound]/3 ... Every value of pointer type is one of the following:

(3.1) — a pointer to an object or function (the pointer is said to point to the object or function), or

(3.2) — a pointer past the end of an object (8.7), or

(3.3) — the null pointer value (7.11) for that type, or

(3.4) — an invalid pointer value.


[expr.unary.op]/1 The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.

因此,表达式*ptr的含义仅针对指向对象或函数的指针ptr定义 - 即,其值属于<的指针强>[基本化合物]/(3.1)。在所有其他情况下,此表达式表现出未定义的行为。

关于c++ - 形成对对象的引用是否构成访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59205336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com