2014-08-28 44 views
129

最近我看到了一個奇怪的C++特性:注入了類名爲什麼有注入的類名?

class X { }; 
X x1; 
class X::X x2; // class X::X is equal to X 
class X::X::X x3; // ...and so on... 

但我不明白爲什麼這個功能是必要的。有沒有需要這個功能的練習?

而我聽說這個功能在舊的C++中不存在。那麼,它什麼時候推出? C++ 03? C++ 11?

回答

148

注入的類名稱意味着X被聲明爲的X成員,所以內部X該名稱查找總是找到當前類,而不是另一X可能在相同的封閉範圍中聲明,例如

void X() { } 
class X { 
public: 
    static X create() { return X(); } 
}; 

是在create()函數創建一個臨時X對象或調用函數X?在命名空間範圍內,它將調用該函數,因此注入類名的目的是確保在X的主體內名稱始終找到類本身(因爲名稱查找從類自己的作用域開始,然後查找附上範圍)。

它在類模板中也很有用,其中注入的類名可以在沒有模板參數列表的情況下使用,例如,使用簡單的Foo而不是完整的模板標識Foo<blah, blah, blah>,因此很容易引用當前的實例。請參閱DR 176以瞭解C++ 98和C++ 03之間的變化。

注入類名的想法存在於C++ 98中,但術語對於C++ 03是新的。

C++ 98表示:

類名插入其中類名看出之後它被立即宣佈的範圍。類名也被插入到類本身的範圍中。

第二句通過DR 147改變,從而C++ 03 [類]/2表示:

類名插入其被後立即宣佈的範圍看到班級名稱類名也被插入到類本身的範圍內;這被稱爲注入類名稱

即使C++ 98之前,所述ARM具有大約相當於措辭意味着類的名稱可以總是在類體內被用於指代類本身:

的名稱類可以用作類名稱,即使在類說明符本身的成員列表中也是如此。

  • 例如,

    class link { link* next; };

+2

我被問相當頻繁,但絕不可能建立一個簡單的例子指出的問題。所以+1例如。 – dhein 2014-08-29 09:26:06

+1

如果您運行clang ++ your_program.cpp -Xclang -ast-dump,並且您看到您的類,然後看到注入的類子節點,則可以清楚地看到這一點。 – xaxxon 2016-06-24 11:19:06

相關問題