c++ - 指针互换性与具有相同地址

标签 c++ arrays pointers language-lawyer c++17

working draft of the standard N4659说:

[basic.compound]
If two objects are pointer-interconvertible, then they have the same address

然后注意到

An array object and its first element are not pointer-interconvertible, even though they have the same address

使数组对象及其第一个元素不可指针相互转换的基本原理是什么?更一般地说,将指针相互转换的概念与具有相同地址的概念区分开来的基本原理是什么?这里面不是有矛盾吗?

看来给定这个语句序列

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);

我们有 p1 == p2,但是,i1 定义明确,使用 i2 会导致 UB。

最佳答案

显然有基于此优化的现有实现。考虑:

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]
}

给定p = &a.x[1]; , g可能会尝试获取对 a.n 的访问权限通过 reinterpret_cast<A*>(reinterpret_cast<double(*)[4]>(p - 1))->n .如果内部转换成功产生指向 a.x 的指针, 然后外部转换将产生指向 a 的指针,给类成员访问定义的行为,从而禁止优化。

关于c++ - 指针互换性与具有相同地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926463/

相关文章:

c++ - OpenCV 中的 CV_8UC1 到 CV_32FC1 的转换

javascript - 将 SSID 列表转换为 JSON/Array

javascript - 映射对象数组

C - 如何将字符串作为参数

pointers - 如何将函数指针存储在向量中?

c++ - 如何设置 clang-format 注释 pragmas 以便多行 doxygen 注释不会被触及?

c++ - 尝试(稍微)概括 C++ 模板。关联容器 key :Value Inversion

c++ - Makefile 定义文件夹结构以查找程序并包含

arrays - 复制变量时的数组地址

c++ - 使用指针逐列遍历多维数组