1 概述
将&、const&、&&、const&&拆解为三个不同的部分。
&、&&、const 的解释如下:
- &:适用于左值对象
- &&:使用于右值对象
- const:适用于常对象
常指的是该对象的内容无法修改。
2 如何调用
下面是 optional
类的四个 *
运算符重载方法,分别对应&、const&、&&、const&&四个修饰词。
constexpr const _Tp&
operator*() const& noexcept
{ return this->_M_get(); }
constexpr _Tp&
operator*()& noexcept
{ return this->_M_get(); }
constexpr _Tp&&
operator*()&& noexcept
{ return std::move(this->_M_get()); }
constexpr const _Tp&&
operator*() const&& noexcept
{ return std::move(this->_M_get()); }
1 调用const&修饰成员函数
const std::optional<int> ol2(10);
*ol2;
2 调用&修饰成员函数
std::optional<int> ol1(10);
3 调用const&&修饰成员函数
先使用 move 方法得到一个右值,之后再调用运算符函数。
使用static_cast获取一个右值也是可以的。
*(std::move(ol1))
*(static_cast<decltype(ol1)>(ol1));
4 调用&&修饰成员函数
先使用 move 方法得到一个右值,之后再调用运算符函数
*(std::move(ol2));
*(static_cast<decltype(ol1)>(ol1));
3 总结
- &:由非常量左值对象调用
- const&:由常量左值对象调用
- &&:由非常量右值对象调用
- const&&:由常量右值对象调用