为了账号安全,请及时绑定邮箱和手机立即绑定

C ++中成员函数的const&,&和&&&说明符

C ++中成员函数的const&,&和&&&说明符

C++
桃花长相依 2019-11-29 11:11:21
最近,我正在阅读的API,boost::optional发现其中的内容:T const& operator *() const& ;T&       operator *() & ;T&&      operator *() && ;我还编写了自己的程序,该程序将成员函数定义为const&,&和&&(请注意,我并不是在讲返回类型,而是在分号之前的说明符),并且它们似乎可以正常工作。我知道声明成员函数const的含义,但是任何人都可以解释声明const&,&和&&的含义。
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

const& 意味着,此重载将仅用于const,non-const和lvalue对象。


const A a = A();

*a;

& 意味着,此重载将仅用于非const对象。


A a;

*a;

&& 意味着,此重载将仅用于右值对象。


*A();

有关C ++ 11标准此功能的更多信息,您可以阅读这篇文章什么是“ * this的右值参考”?


查看完整回答
反对 回复 2019-11-29
?
慕的地10843

TA贡献1785条经验 获得超8个赞

它是成员函数ref限定符,它是C ++ 11中添加的功能之一。this通过指定函数ref限定符(一些细节),可以基于隐式对象参数是左值还是右值来重载非静态成员函数。


要指定REF-预选赛非静态成员函数,您可以用限定功能&或&&。


#include <iostream>

struct myStruct {

    void func() & { std::cout << "lvalue\n"; }

    void func() &&{ std::cout << "rvalue\n"; }

};


int main(){

    myStruct s;

    s.func();            // prints "lvalue"

    std::move(s).func(); // prints "rvalue"

    myStruct().func();   // prints "rvalue"

}


查看完整回答
反对 回复 2019-11-29
?
慕容3067478

TA贡献1773条经验 获得超3个赞

正如您所问的,这些并不是“必需的”。但是它们提供了某些可选的优化。您可能只是拥有T operator *();而已-可以编译,但是会产生一些奇怪的后果- *p = x不会做您期望的事情。我认为重要的是返回类型-我们想要具有不同返回类型的多个重载。一旦了解了不同返回类型的可取性,您还将看到我们最终需要使用限定符来控制每个调用使用哪种重载(以及哪种返回类型)。

查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 903 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号