成员函数上的 const 引用限定符 [重复]

Posted

技术标签:

【中文标题】成员函数上的 const 引用限定符 [重复]【英文标题】:Const reference qualifier on a member function [duplicate] 【发布时间】:2014-05-25 13:07:01 【问题描述】:

我在那里的anwser中看到: Is returning by rvalue reference more efficient?

成员函数定义:

Beta_ab const& getAB() const&  return ab; 

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

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

【问题讨论】:

相关/重复:***.com/q/21861148/420683 请注意,接受的答案示例是非常量 & 限定符,而问题是关于 const& 限定符。如果pet 被限定为void pet() const&;,则示例kitten.pet(); 将实际编译。为了禁止这种情况,我们需要添加额外的一行:void pet() const&& = delete; 【参考方案1】:

& 是一个引用限定符。 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 结合使用,表示只能在左值上调用该成员函数,并且可能是 const。

【讨论】:

您可能会补充说,这是 C++11 中的一项新功能,尚未被所有编译器支持,并且您不太可能在现有代码中看到它(目前)。 这个结构的相关性在于它禁止像Beta_ab const &amp; danger = Beta_ab().getAB();这样的东西 好的,我明白了。因此,如果编译器支持,应该在每个返回对成员变量的 const 引用的 const 成员函数上设置它?我有很多这些,偶尔会遇到与在右值上使用它们相关的错误。 您应该删除答案的前半部分!大多数人已经知道这一点,这将使您的答案的重要部分可见,而无需向下滚动。阅读的第一反应是:嗯,好的,我已经知道 const 修饰符对成员函数的作用...... 好点。删除那部分。【参考方案2】:

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

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

突出显示的const 表示可以在const 对象上调用成员函数。成员函数始终可以在非const 对象上调用,而不管函数的 cv 限定。

所以在这段代码中...

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

我们应该期望突出显示的&amp; 还说明了允许调用该成员函数的对象类型。我们是正确的;在 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); 

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

【讨论】:

以上是关于成员函数上的 const 引用限定符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

成员函数啥时候应该有一个 const 限定符,啥时候不应该?

在引用限定符上重载成员函数的用例是啥?

限定符

C++ 类设计总结回顾------this指针

const 放在函数后

C++ 类和对象