提问人:Vinod 提问时间:9/14/2019 最后编辑:Jan SchultkeVinod 更新时间:9/3/2023 访问量:858
隐式对象参数和此指针
implicit object parameter and this pointer
问:
关于非静态成员函数,在
const-、volatile- 和 ref-qualified 成员函数
它提到:
非静态成员函数可以声明,没有 ref-qualifier, 使用左值 ref-qualifier(参数列表后面的标记 &)或 右值 ref-qualifier(参数列表后面的标记 &&)。 在过载解决期间,非静态 cv 限定成员函数 X 类的处理方式如下:
no ref-qualifier:隐式对象参数具有对 CV 限定的 X 的类型左值引用,并且还允许绑定右值隐含对象参数
Lvalue ref-qualifier:隐式对象参数的类型为 lvalue 参考 cv 合格的 X
rvalue ref-qualifier:隐式对象参数的类型为 rvalue 参考 cv 合格的 X
注意:与 cv-qualification 不同,ref-qualification 不会更改 此指针的属性:在右值引用限定的范围内 函数,*这仍然是一个左值表达式。
在这种情况下,和 和有什么不一样?the implicit object parameter
*this
答:
我认为可以用以下示例来说明差异:
当重载解析选择依赖于 CV 限定符时,将具有适当的 CV 限定符,就像隐式对象参数一样:*this
struct t_Tester
{
constexpr auto Probe(/* t_Tester & param */) { return 1; }
constexpr auto Probe(/* t_Tester const & param */) const { return 2; }
constexpr auto Test(/* t_Tester const & param */) const { return (*this).Probe(); }
};
static_assert(2 == t_Tester{}.Test());
但是,当重载解析选择依赖于右值/左值引用时,即使隐式对象参数是右值引用并且对象本身是右值,限定符仍将是左值:*this
struct t_Tester
{
constexpr auto Probe(/* t_Tester & param */) & { return 1; }
constexpr auto Probe(/* t_Tester && param */) && { return 2; }
constexpr auto Test(/* t_Tester && param */) && { return (*this).Probe(); }
};
static_assert(1 == t_Tester{}.Test());
注意:在不显式使用指针的情况下在类作用域中调用函数(如 )将使用隐含对象参数(与 相同),不应与隐式对象参数(它只是重载解析期间使用的成员函数签名的不可见部分)混淆。this
return Probe();
(*this)
评论
return (*this).Probe();
return Probe();
return Probe()
(*this)
ref-qualifiers 允许基于表达式的引用类型进行函数重载。
由于 C++ 中没有指向引用的指针(或引用),因此不能指向(n 右值)引用,因此不能是右值。this
*this
rvalue、lvalue 和 reference(故意)在调用函数后失去其相关性。
上一个:C++ 生成文件问题
下一个:获取复杂形状的中心线
评论
*this
std::move(*this)
this
memfun()
(*this).memfun()
*this
(*this)