2013-01-04 65 views
5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

編譯器會抱怨:error C2065: 'X' : undeclared identifier爲什麼C++ 11不支持這樣的名稱查找?

編譯器知道構造函數的參數類型是什麼,所以當我通過X作爲參數,編譯器應該知道這是一個有效的參數。

我知道這不是ADL(依賴於參數的名稱查找,也稱爲Koenig Lookup),但我認爲它非常有用,非常方便。因爲我不必寫如下:

A a(A::X); 

我認爲ADL規則應該推廣到這種情況。

我對不對?

+2

這就像ADL ... FDL(函數相關查找)的逆函數。 –

+9

您是否考慮過如果您還有一個名爲'X'的局部變量,這將如何應用?不管怎樣,我讀到你的問題的方式,你說這是無效的C++,並詢問C++標準是否應該改變。這是錯誤的地方。 – hvd

+0

謝謝,hvd。你給了我們一個令人信服的理由。 – xmllmx

回答

10

C++中的函數調用受到函數重載解析的影響。重載解析由參數類型驅動。即該語言「作品」專指該方向:參數類型具有給定名稱的函數的特定版本。

您打算引入一個反向過程 - 基於函數名稱的參數類型推導。這在一般情況下不起作用。當只有一個候選函數時(例如在你的例子中),它可能會起作用,但是同樣,這與在一般情況下函數超載的原則相反。

當然,當不合格的名稱X名稱查找可以看到別的命名除了XA::X情況會變得更加複雜。我認爲它很容易變得非常違反直覺。

+0

我理解一般適用的複雜性參數。所以,也許不是一般的,但由於某種原因,我認爲這對'enums'特別有用。因爲它們通常用作功能的任意命名選項。 – alfC

4

我認爲ADL規則應該推廣到這種情況。

不,謝謝。

C++有一些(令人討厭的)驚喜(你知道的其他語言需要explicit作爲關鍵字嗎?),並且在你的例子中我看不到足夠的優點來添加這個意想不到的語言規則列表,代碼在意外的情況下。

如果你發現在class-name後加上兩個冒號需要額外的輸入,那麼肯定C++語法的一般巴洛克性質應該會讓你失望?

相關問題