2016-03-12 93 views
3

我對面的來與具有相同的名稱作爲參數來初始化成員數據:這個關鍵字在initilizer歧義分辨率

class T { 
    int x; 
public: 
    T(int x) : x(x) {} // assign parameter x to T::x 
}; 

它工作得很好。但是當我嘗試使用明確初始化這個關鍵字時,發生了 錯誤。

T(int x) : this->x (x) {} // error 

可能有人解釋錯誤的原因是什麼?

回答

4

根據member initializer list的語法,這裏預期的是標識符,而this->x則不是。

類或標識符(表達式列表(可選))
類或標識符 - 的任何標識符,類名,或decltype表達名稱非靜態數據成員,直接或虛擬基,或(委派構造函數)的類本身

由於可能標識符上面顯示,x(x)細而沒有歧義,沒有必要使用this->可言。

+0

可以將'this-> x'作爲'T :: x'的_identifier_嗎? – NERDYLIZARD

+1

@NERDYLIZARD不,它的語法不允許。 – songyuanyao

+0

你的意思是說'this-> something'根本不被認爲是標識符? – NERDYLIZARD

0

你不能以這種方式使用初始化列表。如果你想要等價的行爲,你必須把這個任務放在定義中。

class T { 
    int x; 
public: 
    T(int x) { 
     this->x = x; 
    } 
}; 
1

被初始化的成員已經被置於初始化列表中,使其已被消除。試圖使用this來引用該成員是一個錯誤。構成成員的價值同樣不含糊,因爲你不能從自身構造成員。這就是爲什麼你可以爲成員和構造函數參數使用相同的名稱。