n. *_* m. 24 c++ arrays pointers language-lawyer c++17
[basic.compound]
如果两个对象是指针可互换的,那么它们具有相同的地址
然后注意到
数组对象及其第一个元素不是指针可互换的,即使它们具有相同的地址
使数组对象及其第一个元素非指针可互换的基本原理是什么?更一般地说,区分指针 - 可互换性概念与具有相同地址的概念的理由是什么?在那里某处不存在矛盾吗?
看来,给定这一系列陈述
int a[10];
void* p1 = static_cast<void*>(&a[0]);
void* p2 = static_cast<void*>(&a);
int* i1 = static_cast<int*>(p1);
int* i2 = static_cast<int*>(p2);
Run Code Online (Sandbox Code Playgroud)
p1 == p2但是,我们已经i1明确定义并且使用i2会导致UB.
T.C*_*.C. 20
显然存在基于此优化的现有实现.考虑:
struct A {
double x[4];
int n;
};
void g(double* p);
int f() {
A a { {}, 42 };
g(&a.x[1]);
return a.n; // optimized to return 42;
// valid only if you can't validly obtain &a.n from &a.x[1]
}
Run Code Online (Sandbox Code Playgroud)
考虑到p = &a.x[1];,g可能试图获得访问a.n的reinterpret_cast<A*>(reinterpret_cast<double(*)[4]>(p - 1))->n.如果内部强制转换成功地产生了一个指向a.x,那么外部强制转换将产生一个指针a,给予类成员访问定义的行为,从而禁止优化.