2016-05-17 69 views
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'?你通过解决这个问题得到了它,但我不知道你为什么期望这个问题。 –

回答

9

this->在这种情况下被认为是无操作,它基本上等同于sizeof(sz)

没错。

this->sz的类型是std::size_t,在该上下文中是完整类型。

类型的*this这里完成,但你引用的推移,说明为什么这不要紧,我们可以通过对分析sz专门直行。

因此,this->对表达式的语义没有实际影响,无论是好的还是坏的。

正如Sergey所说,有一种情况下使用this->进行成员访问会产生差异(模板库!),而这不是其中之一。