这个尺寸是如何计算的?

4

5.1.1/2规定:

关键字this表示指向调用非静态成员函数(9.3.2)或评估非静态数据成员的初始化程序(9.2)的对象的指针。

并且:

与其他上下文中的对象表达式不同,*this在类成员函数体外部进行类成员访问(5.2.5)时,不需要对其进行完整类型要求。

以下代码将打印8

#include <cstddef>
#include <iostream>

struct Test
{
    std::size_t sz = sizeof(this->sz);
};

int main()
{
    std::cout << Test{}.sz;
}

5.3.3中写道:
操作数可以是表达式,这是未求值操作数(第5条),或括号括起来的type-id。不得对具有函数类型或不完全类型的表达式应用sizeof运算符...
在这种情况下,sizeof this->sz 的结果相同。
在这种情况下,this-> 是否被视为无操作,并且本质上等同于sizeof(sz)

2
在使用this->访问成员变量时,实际上很少有(只有一个)情况会产生差异,而这并不是其中之一。 - SergeyA
3
(*this).sz 是一个完整的类型,对吗,std::size_t?你通过解引用 this 来得到它,但我不确定你为什么认为这很重要。 - Nathan Cooper
1个回答

9
在这种情况下,this->被认为是无操作,并且与sizeof(sz)基本等效。this->sz的类型是std::size_t,在该上下文中它是一个完整的类型。虽然*this的类型不完整,但您引用了阐述为何这并不重要的段落,因此我们可以直接分析sz。因此,this-> 对表达式的语义没有实际影响,无论是好是坏。正如Sergey所说,有一种情况使用this->进行成员访问会有所不同(模板基类!),但这不是其中之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接