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

gal*_*tte 12 c++ reference member-functions const-reference

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

成员函数定义:

Beta_ab const& getAB() const& { return ab; }
Run Code Online (Sandbox Code Playgroud)

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

最后的const&意思是什么?

dyp*_*dyp 21

&是一个参赛资格赛.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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以补充一点,这是C++ 11中的一项新功能,尚未得到所有编译器的支持,并且您现在的代码中还不太可能看到它(尚未). (4认同)
  • 这种结构的相关性是它禁止诸如"Beta_ab const&danger = Beta_ab().getAB();"之类的内容. (3认同)

Okt*_*ist 7

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

Beta_ab const& getAB() const { return ab; }
                       ^^^^^
Run Code Online (Sandbox Code Playgroud)

高亮const表示可以在const对象上调用成员函数。const无论函数的 cv 限定如何,总是可以在非对象上调用成员函数。

所以在这段代码中...

Beta_ab const& getAB() const & { return ab; }
                             ^
Run Code Online (Sandbox Code Playgroud)

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

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }
Run Code Online (Sandbox Code Playgroud)

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

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }
Run Code Online (Sandbox Code Playgroud)

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