2016-05-17 128 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->進行成員訪問會產生差異(模板庫!),而這不是其中之一。