对对象的引用构成访问吗?
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
-对正确类型的引用是允许和有效的。答案 0 :(得分:4)
[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)。在所有其他情况下,此表达式都表现出不确定的行为。