返回引用类型的成员函数是 暗示了使用它的this指针是左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针是左值还是右值都是调用同一个函数。
比如说:这段代码
Obj o{2}; o.getVal();
跟这段代码
Obj{2}.getVal()
使用了同一个getVal()函数。
那理解到这里是对的吗?
先说结论,来说一个c++的一个理解。
如果成员函数是有一致性(consistency)的,那么non-const, non-static的函数 总是要被&( &-qualified)。
举个例子
这个例子里你不能做
inc(A{})
但是可以做
A{}.inc().
不能做是因为内部语言有意这么设计,因为 A{} 传给 inc( A{} ) 函数,你期待这个函数对暂存值A{}进行修改,但是A{}传进去后就销毁了,caller并没有感知到。而另一种写法A{}.inc()是被允许的。这是consistency的做法。
当然书写设计自己的成员函数,不一定都有必要去做ref-qualified,但是这里我带你看一些使用ref-qualified的真实例子。
一种场景是上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。这个情况这个函数应该被修饰为 &&-qualified)。比如说这个函数会从对象object取到资源resources,然后处于未指定的状态。
有时候一个成员函数需要有能力从类中取到资源,那么他就能被右值rvalue call到,否则,它就是const修饰的成员函数。看这个例子std::string::substr有用const&重载,也有用&&重载的两个函数。
这种场景需要&- overload和&&-overload (+ potentiallyconst/volatilevariations)。可以看std::optional::value这个例子。
在 C++23 有显式的对象, 因为用户可以forward上次的references. 也有可能简单地写一个non-static成员函数。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。