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

时间:2012-12-31 16:33:41

标签: c++ c++11 rvalue-reference rvalue

我想知道一个方法返回一个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;
            }
    }
};

如何更改此内容以便我可以使用某些内容来实现

的效果
vec4 v;
...
v[2] = 5.0f;

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

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

3 个答案:

答案 0 :(得分:6)

这不需要C ++ 11。只是:

float & operator[](std::size_t i) { return data[i]; }

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

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

float operator[](std::size_t i) const { return data[i]; }

您可以考虑使用右值成员函数限定符的唯一时间是您是否允许将分配给临时成员:

vec4{}[2] = 5;

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

float & operator[](std::size_t i) && { return data[i]; }
//                               ^^^^

答案 1 :(得分:4)

您可以简单地使用:

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

这允许您编写v[2] = 5.0f;,它将按预期工作。这里不需要r值参考。

您还应该添加一个const-overload来检索值,如下所示:

float operator [] (int index) const
{
    return data [i];
}

这将允许您编写如下代码:const vec4 v; float x = v[1];

答案 2 :(得分:4)

对于你想要完成的事情,你显然想要返回一个左值,而不是右值。这实际上非常简单:

float &operator[](size_t i) { return data[i]; }

请注意,当您在类定义中定义函数时,inline是多余的 - 在类定义中定义函数会使其默认为inline