2

私はこのクラスに出くわしました:

class Vec3f
{
    ...
    float x, y, z;
    ...
};

inline float operator[](const int index) const
{
    return (&x)[index];
}

inline float& operator[](const int index)
{
     return (&x)[index];
}

このクラスは [] を使用して配列のように x、y、z 値にアクセスしているため、v[0] は x の値、v[1] は y の値、v[2] はz、しかし

  • return ステートメントはどのように機能しますか?
  • 「xのアドレスからindexで指定されたアドレスの値を取得する」の読み方でよろしいでしょうか?
  • Do (&x) はかっこで囲む必要があります。そうしないと、x[index] のアドレスの値が返されますね。
4

1 に答える 1

4

技術的には、これは有効なコードではありません。

しかし、何が起こっているのですか:

// Declare four variables
// That are presumably placed in memory one after the other.
float x, y, z;

コード内:

return (&x)[index];

// Here we take the address of x (thus we have a pointer to float).
// The operator [] when applied to fundamental types is equivalent to 
// *(pointer + index)

// So the above code is
return *(&x + index);
// This takes the address of x. Moves index floating point numbers further
// into the address space (which is illegal).
// Then returns a `lvalue referring to the object at that location`
// If this aligns with x/y/z (it is possible but not guaranteed by the standard)
// we have an `lvalue` referring to one of these objects.

これを機能させて合法にするのは簡単です:

class Vec3f
{
    float data[3];
    float& x;
    float& y;
    float& z;

    public:
        float& operator[](const int index) {return data[index];}

        Vec3f()
            : x(data[0])
            , y(data[1])
            , z(data[2])
        {}
        Vec3f(Vec3f const& copy)
            : x(data[0])
            , y(data[1])
            , z(data[2])
        {
            x = copy.x;
            y = copy.y;
            z = copy.z;
        }
        Vec3f& operator=(Vec3f const& rhs)
        {
            x = rhs.x;
            y = rhs.y;
            z = rhs.z;
            return *this;
        }
};
于 2013-08-18T23:05:20.743 に答える