前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >返回类型引用(ref-qualified)的C++成员函数暗示了什么?

返回类型引用(ref-qualified)的C++成员函数暗示了什么?

原创
作者头像
mariolu
发布2023-09-03 16:08:09
1520
发布2023-09-03 16:08:09
举报

一、引子:

返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。

比如说:这段代码

代码语言:javascript
复制
Obj o{2}; o.getVal();

跟这段代码

代码语言:javascript
复制
Obj{2}.getVal()

使用了同一个getVal()函数。

那理解到这里是对的吗?


二、解释:

先说结论,来说一个c++的一个理解。

如果成员函数是有一致性(consistency)的,那么non-const, non-static的函数 总是要被&( &-qualified)。

举个例子

这个例子里你不能做

代码语言:javascript
复制
inc(A{}) 

但是可以做

代码语言:javascript
复制
 A{}.inc().

不能做是因为内部语言有意这么设计,因为 A{} 传给 inc( A{} ) 函数,你期待这个函数对暂存值A{}进行修改,但是A{}传进去后就销毁了,caller并没有感知到。而另一种写法A{}.inc()是被允许的。这是consistency的做法。


三、扩展

当然书写设计自己的成员函数,不一定都有必要去做ref-qualified,但是这里我带你看一些使用ref-qualified的真实例子。

3.1、只对右值形参操作

一种场景是上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。这个情况这个函数应该被修饰为 &&-qualified)。比如说这个函数会从对象object取到资源resources,然后处于未指定的状态。

有时候一个成员函数需要有能力从类中取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。看这个例子std::string::substr有用const&重载,也有用&&重载的两个函数。

3.2、将一个函数的return value传递作为给另一个函数的输入

这种场景需要&- overload和&&-overload (+ potentiallyconst/volatilevariations)。可以看std::optional::value这个例子。


四、未来C++23

在 C++23 有显式的对象, 因为用户可以forward上次的references. 也有可能简单地写一个non-static成员函数。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、引子:
  • 二、解释:
  • 三、扩展
  • 3.1、只对右值形参操作
  • 3.2、将一个函数的return value传递作为给另一个函数的输入
  • 四、未来C++23
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com