变量地址的运算符[]如何工作?

How does operator [] of an address of variable work?

例如:

int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5

我在一本书中找到了这种 3DVector 表示:

struct Vector3D{
float x,y,z;
Vector3D() = default;
Vector3D(float a, float b, float c) : x(a), y(b), z(c) {}
float & operator[](int i){
return ((&x)[i]);
}
};

如果将其用作:

    Vector3D myVec(0,2,3);
    std::cout<<myVec[0]<<std::endl;
    std::cout<<myVec[1]<<std::endl;
    std::cout<<myVec[2]<<std::endl;

它将打印 x、y、z 的值

它是如何工作的?这安全吗?

当您执行 &x 时,您会得到一个指向 x 的指针。当您执行 pointer[N] 时,编译器所做的就是将其转换为 *(pointer + N)。在您的代码中,因为 N0 我们只剩下 *(&x) 这只是取消引用我们刚刚创建的指针并返回变量本身。


您在其中找到的代码实际上是未定义的行为。当他们这样做时

float & operator[](int i){
    return ((&x)[i]);
}

他们假设 class 中没有填充,并将 3 个单独的成员视为一个数组。但是,无法做出此假设,并且访问被明确称为标准中的未定义行为。