19

我在那里的anwser中看到: 通过右值引用返回更有效吗?

成员函数定义:

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

我熟悉成员函数上的cv-qualifier ( ),但不熟悉.constconst&

最后一个const&是什么意思?

4

2 回答 2

32

&一个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-qualifierconst意味着你只能在左值上调用这个成员函数,而那些可能是 const。

于 2014-04-11T11:43:43.900 回答
9

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

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

突出显示的const意思是可以在const对象上调用成员函数。const无论函数的 cv 限定如何,都可以在非对象上调用成员函数。

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

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

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

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

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

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

但是,对于普通参数,它的工作方式略有不同,如在此示例中,如果删除了第二个重载,则第一个重载将接受一个右值。

于 2014-04-11T14:24:13.730 回答