在C++ 11中返回一个可变值

jep*_*ugs 0 c++ rvalue rvalue-reference c++11

我想知道有一个方法返回一个r值.具体来说,我想知道是否有办法用重载运算符来做到这一点.我有这个代码:

struct vec4 {
    float x;
    float y;
    float z;
    float w;
    ...
    inline float operator [] (int i)
    {
            switch (i) {
            case 0:
                    return this->x;
            case 1:
                    return this->y;
            case 2:
                    return this->z;
            case 3:
                    return this->w;
            default:
                    exit(1);
                    return 0;
            }
    }
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这一点,以便我可以使用某些东西来达到效果

vec4 v;
...
v[2] = 5.0f;
Run Code Online (Sandbox Code Playgroud)

我听说过C++ 11中的rvalue引用,它们可能是一个潜在的解决方案吗?

编辑:我找到了一种方法来输入我的实际代码.

Ker*_* SB 6

这不需要C++ 11.只要:

float & operator[](std::size_t i) { return data[i]; }
Run Code Online (Sandbox Code Playgroud)

现在你可以说v[2] = 5;,一切都很好.

如果需要,可以添加一个不使用引用的常量重载,并且可以用于读取该值.

float operator[](std::size_t i) const { return data[i]; }
Run Code Online (Sandbox Code Playgroud)

您可以考虑rvalue成员函数限定符的唯一时间是您是否允许分配临时成员:

vec4{}[2] = 5;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您仍然返回左值引用,但您必须限定成员函数:

float & operator[](std::size_t i) && { return data[i]; }
//                               ^^^^
Run Code Online (Sandbox Code Playgroud)