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

与标准中隐含此参数的定义相矛盾

秦才良
2023-03-14

我正在学习C语言的课程。我从标准中看到了以下语句:

在重载解析期间,类X的非静态cv限定成员函数被视为一个函数,如果它没有ref限定符或具有左值ref限定符,则该函数将左值引用类型的隐式参数带到cv限定X。否则(如果它有rvalue ref限定符),它将被视为一个函数,将rvalue reference类型的隐式参数作为cv限定的X。

上述语句似乎暗示,对于类的限定非静态成员函数,类的限定非静态成员函数将具有类型为常量X的隐式参数

但后来我也遇到了:

类的成员函数中此的类型为X*(指针指向X)。如果成员函数是cv限定的,则其类型为cv X*(指针指向相同的cv限定X)。由于构造函数和析构函数不能是cv限定的,因此即使在构造或销毁const对象时,它们中的类型也始终是X。

因此,根据上面的第二个引用,类X的const限定非静态成员函数的隐式this参数的类型为const X*

我的问题是为什么会有这样的区别。我的意思是在const定性的非静态成员函数的重载解析期间,为什么隐式参数被认为是const X


共有1个答案

习旻
2023-03-14

隐式对象参数与此参数不同这是一个指针,指向调用成员函数的对象,而隐式对象参数是成员函数的第一个想象参数,在成员函数调用中传递对象表达式(成员访问表达式中的剩余部分),因此应该是引用参数。

为隐式对象参数使用指针是没有意义的。这样就不可能在对象表达式的值类别上重载函数。如果成员函数为<代码>

所以隐式对象参数是const T

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

  • 本页列出了所有Apache遵守的相关标准,并伴有简要描述。 除了下面列出的参考信息,下列资源也值得看看: http://purl.org/NET/http-errata - HTTP/1.1 勘误表 http://www.rfc-editor.org/errata"http://ftp.ics.uci.edu/pub/ietf/http/"> http://ftp.ics.uci.edu/pub/

  • 如何定义具有多个隐式参数的函数。

  • C 14的[class]/7中定义了一个标准布局类,如下所示(重点是我的): 标准布局类是这样的类: (7.1)-没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员, (7.2)-没有虚拟函数(10.3)和虚拟基类(10.1), (7.3)-对所有非静态数据成员具有相同的访问控制(第11条), (7.4)-没有非标准布局基类, (7.5)-在大多数派生类中没有非静态数据成员,并且最多有

  • 我知道,当使用WebView加载第三方内容时,在安全性方面有很多事情需要考虑,因为WebView在您的流程中运行。Chrome自定义选项卡在哪个过程中工作?您的应用程序是否存在类似的安全问题?

  • 关于非静态成员函数,请参见 常量、volatile和ref限定成员函数 其中提到: 非静态成员函数可以不使用ref限定符,也可以使用左值ref限定符(标记 no ref-限定符:隐式对象参数具有引用cv限定X的左值类型,并且还允许绑定右值隐式对象参数 左值引用限定符:隐式对象参数具有引用cv限定X的左值类型 rvalue ref限定符:隐式对象参数的类型rvalue reference指向cv限定