2015-05-22 17 views
29

在C++ 11中都添加了override specifierfinal specifier。他們從加入到C++ 11如constexprdecltype其他符不同,因爲它們不keywords等都是可供使用的標識符:爲什麼重寫和最終標識符具有特殊含義而不是保留關鍵字?

int main() 
{ 
    int override = 0 ; // Ok 
    int final = 0 ;  // Ok 
    //int constexpr = 0 ; // Error 
} 

他們被稱爲標識符有特殊的含義 ,其上覆蓋在C++草案標準11部分2.11[lex.name]重點礦山):

在T中的標識符當在某個上下文中出現 時,能夠3具有特殊含義。當在語法中被引用時,這些標識符被明確地使用而不是使用標識符 語法生產。任何關於給定標識符是否具有特殊含義的含糊不清的問題都解決爲將標記解釋爲常規標識符 。

表3 - 具有特殊意義同時列出了覆蓋最後標識符。

爲什麼這兩個符最終會被標識符具有特殊的意義,而不是關鍵字

+1

我以爲你[以前建立](https://stackoverflow.com/questions/30311551/is-it-undefined-behavior-to-redefine-an-identifier-with-special-meaning)它是未定義的行爲重新定義具有特殊含義的標識符? – CoryKramer

+0

@CoryKramer這是'#define's。儘管@Shafik可能想澄清這個問題。 –

+0

@CoryKramer是不同的,你不能'#define'或'#undef' –

回答

35

添加新關鍵字很困難,因爲它會從用戶身上帶走標識符。它最終被選擇,目前使用的標識符或選擇是非常不可能打破舊的代碼,但醜陋或沒有意義的正在使用他們的名字的方式可能會破壞舊代碼標識符之間的權衡。

在這種特殊情況下覆蓋和語法使用的地方最後結束了在沒有用戶標識符可以出現。因此,在這些地方,標識符可以具有特殊含義,並且在這些上下文之外,可以將它們視爲常規標識符,使標識符可供用戶使用。 C++/CLI已用這種技術,因爲2005並且它們被稱爲上下文相關關鍵字其上覆蓋在C++/CLI standard9.1.1標識符。

我們可以在寫了,解決的N3163: Override Control Using Contextual Keywords增加對虛擬控制屬性支持的不同方法的權衡看到。它討論了三個選項:

  • 使用[[attributes]],這被認爲是不期望的,原因包括它們只是關鍵字變相(變形例從紙下面):

    class A : public B { 
        virtual void f [[override]]() { ... } 
        virtual void h [[final]]() { ... } 
    }; 
    
  • 使用保留關鍵字,這可能會破壞現有的代碼,除非選擇了難看的名字modifi ED例如從紙下面):

    class A : public B { 
        virtual void f override_func() { ... } 
        virtual void h final_func() { ... } 
    }; 
    
  • 使用上下文相關的關鍵字,不破壞現有的代碼允許好的名稱從下面紙變形例):

    class A : public B { 
        virtual void f() override { ... } 
        virtual void h() final { ... } 
    }; 
    

從紙張以下段落總結了論據使用上下文敏感的關鍵字比其他兩個選擇(重點煤礦):

觀察在拉珀斯韋爾提出,這種方法可以使 錯誤恢復和語法突出更加困難。例如, 語法突出顯示有點困難,因爲突出顯示關鍵字而不是全局的 需要進行解析,以確定 標識符是否位於其具有特殊含義的位置,並且應突出顯示 。但是這並不是特別困難,尤其是 與其他更困難的事情相比,我們已經有 在C++中與其他語言做比較。

這些是一些編譯器作家一週的小麻煩, 但對用戶是無縫的。這是正確的權衡。否則, 具有醜陋的全局保留名稱(選項2)或不合適,並且 明顯地被閂上 - 在屬性(選項1)使一些編譯器作家在一週內更容易,但數百萬用戶將不得不生活 與永遠

通過N3206: Override control: Eliminating AttributesN3272: Follow-up on override control將這些更改應用於標準。

相關問題