隐式对象参数和this指针

问题描述 投票:0回答:2

参考非静态成员函数,下

常量、易失性和引用限定成员函数

提到:

非静态成员函数可以在没有引用限定符的情况下声明, 带有左值引用限定符(参数列表后的标记 &)或 右值引用限定符(参数列表后的标记 &&)。 在重载决策期间,非静态 cv 限定的成员函数 X 类的处理方式如下:

无引用限定符:隐式对象参数具有对 cv 限定的 X 的左值引用类型,并且还允许绑定右值隐含对象参数

左值引用限定符:隐式对象参数的类型为左值 参考简历限定 X

右值引用限定符:隐式对象参数的类型为右值 参考简历限定 X

注意:与 cv-qualification 不同,ref-qualification 不会改变 this 指针的属性:在引用限定的右值内 函数,*这仍然是一个左值表达式。

在这种情况下,

the implicit object parameter
*this
有什么区别?

c++ methods this non-static ref-qualifier
2个回答
2
投票

我认为可以用下面的例子来说明区别:

当重载决策选择依赖于 CV 限定符时

*this
将具有适当的 CV 限定符,就像隐式对象参数一样:

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)
相同),不应与 隐式对象参数混淆(这只是重载解析期间使用的成员函数签名的不可见部分)。


1
投票

ref-qualifiers 允许基于表达式引用类型的函数重载。

由于 C++ 中没有指向引用的指针(或引用),所以

this
不能指向(n个右值)引用,因此
*this
不能是右值。

一旦调用函数,右值、左值和引用(故意)就会失去它们的相关性。

© www.soinside.com 2019 - 2024. All rights reserved.