我在那里的一个答案中看到:通过右值引用返回是否更有效?

成员函数定义:

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

我熟悉 简历限定符 (const) 在成员函数上,但不是 const&.

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

有帮助吗?

解决方案

& 是一个 引用限定符. 。引用限定符是 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 限定符结合使用 const, ,这意味着您只能在左值上调用此成员函数,并且这些左值可能是 const。

其他提示

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

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); }

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top