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

Иль*_*йда 1 c++ overloading operator-keyword

例如:

int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
Run Code Online (Sandbox Code Playgroud)

我在一本书中发现了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]);
}
};
Run Code Online (Sandbox Code Playgroud)

并将其用作:

    Vector3D myVec(0,2,3);
    std::cout<<myVec[0]<<std::endl;
    std::cout<<myVec[1]<<std::endl;
    std::cout<<myVec[2]<<std::endl;
Run Code Online (Sandbox Code Playgroud)

它将打印x,y,z的值

怎么运行的?这安全吗?

Nat*_*ica 6

当您执行操作时,&x将获得指向的指针x。当您执行pointer[N]编译器的操作时,会将其转换为*(pointer + N)。在你的代码,因为N0我们只剩下*(&x)这是刚刚提领我们刚刚创建回馈变量本身的指针。


您在其中找到的代码实际上是未定义的行为。他们什么时候做

float & operator[](int i){
    return ((&x)[i]);
}
Run Code Online (Sandbox Code Playgroud)

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