当前位置: 首页 > 知识库问答 >
问题:

隐式对象参数和此指针

西门良才
2023-03-14

关于非静态成员函数,请参见

常量、volatile和ref限定成员函数

其中提到:

非静态成员函数可以不使用ref限定符,也可以使用左值ref限定符(标记

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

左值引用限定符:隐式对象参数具有引用cv限定X的左值类型

rvalue ref限定符:隐式对象参数的类型rvalue reference指向cv限定X

注意:和cv限定不同,ref限定不会更改此指针的属性:在右值ref限定函数中,*这仍然是一个左值表达式。

在这种情况下,隐式对象参数*此之间有什么区别?

共有2个答案

葛永丰
2023-03-14

ref限定符允许基于表达式引用类型的函数重载。

由于C中没有指向引用的指针(或引用),因此此不能指向(n右值)引用,因此*此不能是右值。

一旦函数被调用,rvalue、lvalue和reference(有意地)就失去了它们的相关性。

乐宜民
2023-03-14

我认为这种差异可以用以下例子来说明:

当重载分辨率选择依赖于CV限定符*时,此将有一个合适的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());

但是,当重载分辨率选择依赖于右值/左值引用限定符*时,即使隐式对象参数是右值引用且对象本身是右值,该仍将是左值:

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());

注意:在类范围内调用函数,而不显式地使用这个指针(比如return Probe())将使用隐式对象参数(与(*this))相同),但不应将其与隐式对象参数(它只是重载解析期间使用的成员函数签名的不可见部分)混淆。

 类似资料:
  • 在此链接中:隐式对象参数 在此引用: 如果任何候选函数是没有显式对象参数(自C 23以来)但没有构造函数的成员函数(静态或非静态),则将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象,并显示在第一个实际参数之前。 我不明白为什么这里提到静态这个词?隐式对象参数不是(this)指针吗((this)指针)只适用于非静态函数)? 在此链接中编辑:链接 报价: 关键字this是一个右值(直到

  • 一、隐式转换 1.1 使用隐式转换 隐式转换指的是以 implicit 关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能。示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hamm

  • JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象: 对象 描述 request HttpServletRequest 接口的实例 response HttpServletResponse 接口的实例 out JspWriter类的实例,用于把结果输出至网页上 session HttpSess

  • 可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。 1 在服务消费方端设置隐式参数 setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。 RpcContext.getContext().setAttachment("index", "1"); // 隐式传

  • 在这两种情况下,使编译器行为不同的区别是什么?如何解决此问题?

  • 最近,我问了一个问题,其中一个答案是: 标准中没有“隐式此参数”这样的东西。该标准称之为“隐式对象参数”。 然后有人评论说: 标准中没有“隐式此参数”之类的东西。“似乎是错误的。来自expr.call#4:“如果函数是非静态成员函数,则函数的参数应使用指向调用对象的指针初始化,就像通过显式类型转换一样进行转换。” 看到上述评论,我认为答案在技术上是不正确的,因为答案说“标准中没有“隐含此参数”这样