成员函数上的Const引用限定符

时间:2014-04-11 11:38:38

标签: c++ reference member-functions const-reference

我在那里看到了一个人: Is returning by rvalue reference more efficient?

成员函数定义:

Beta_ab const& getAB() const& { return ab; }

我熟悉成员函数的 cv-qualifier const),但不熟悉const&

最后const&是什么意思?

2 个答案:

答案 0 :(得分:19)

& ref-qualifier 。 Ref-qualifiers是C ++ 11中的新功能,并且在所有编译器中都不支持,所以你现在经常看不到它们。它指定只能在左值(而不是右值)上调用此函数:

#include <iostream>

class kitten
{
private:
    int mood = 0;

public:
    void pet() &
    {
        mood += 1;
    }
};

int main()
{
    kitten cat{};
    cat.pet(); // ok

    kitten{}.pet(); // not ok: cannot pet a temporary kitten
}

结合cv-qualifier const,意味着你只能在lvalues上调用这个成员函数,而那些可能是const。

答案 1 :(得分:4)

我们知道在这段代码中......

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

突出显示的const表示可以在const对象上调用成员函数。无论函数的cv资格如何,都可以始终在非const对象上调用成员函数。

所以在这段代码中......

Beta_ab const& getAB() const & { return ab; }
                             ^

我们应该期望突出显示的&也说明了允许调用此成员函数的对象类型。我们是对的;在C ++ 11中,这表示成员函数只能在左值上调用。

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

在上面的例子中,在lvalues上调用第一个重载,在非const rvalues上调用第二个重载。类似于以下更熟悉的示例,将限定符应用于普通函数参数:

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

虽然普通参数的工作方式略有不同,但在本例中,如果第二次重载被删除,第一次重载将接受rvalue。