2010-11-04 152 views
3
void S(){} 
struct S{}; 

int main(){ 
    S(); 
} 

在上面的代碼中,main中的表達式'S()'被視爲函數調用表達式,而不是嘗試創建類型'S'的臨時表達式。歧義分辨率

C++標準的哪一部分討論這種表達式的解析以支持函數聲明?出於某種原因,我無法找到它。

回答

5

第3.3.7節/ 2

類名(9.1)或枚舉名稱(7.2)可通過一個對象,功能,或在相同的範圍中聲明枚舉的名稱被隱藏。 如果類或枚舉名稱與對象,函數或枚舉器在同一個作用域(以任何順序)中聲明具有相同名稱,則隱藏類或枚舉名稱 無論對象,函數或枚舉器名稱是可見

然後,你需要使用精細的類型說明符在這種情況下

3.4.4/1闡述類型說明符

的闡述型說明符可以被用於指一個先前聲明的類名或枚舉名,即使 儘管名稱已被非類型聲明(3.3.7)隱藏。詳細說明類型說明符中的類名稱或枚舉名稱可以是簡單的標識符,也可以是合格標識符。

+1

燁好友那是一個感謝 – Chubsdad 2010-11-04 05:19:00

+0

@Chubsdad:':)' – 2010-11-04 05:19:27

0

它可以解決或者通過使用範圍解析運算符(:。:)或通過使用虛擬關鍵字(當我們面對的是無論是多或混合繼承