形成对对象的引用是否构成访问?
Does forming a reference to an object constitute access?
形成对对象的引用是否构成访问?
以下是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(下的指针。在所有其他情况下,此表达式表现出未定义的行为。
相关文章:
- 函数是否可以访问传递给main()的参数
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 成员访问是否在空指针上定义C++?
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 是否可以使用指针访问变量以避免直接编辑变量?
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 通过指针访问是否如此昂贵
- 持续的时间访问是否在某个时候意味着连续内存
- clang或gcc关于这个内部类成员访问是否正确
- 数组中的二叉搜索访问是否比使用哈希表更快
- 对共享变量的无保护访问是否总是数据竞赛
- 将多维C++数组作为一个连续块(堆上)访问是否有效
- 通过shared_ptr访问是否比原始指针更污染缓存行
- std::原子访问是否充当内存屏障
- 一行中对同一类成员的多个访问是否以某种方式进行了优化