2015-10-19 76 views
2

爲類成員使用聲明僅允許作爲成員聲明的原因是什麼?我不能做使用內部類型的聲明

struct Outer 
{ 
    typedef int Inner; 
}; 

void f() 
{ 
// this doesn't work with C++14 
    using Outer::Inner; 
} 

,但我認爲這將是使用-陳述句引進宣佈其他地方到當前區域名稱的預期語義相當正交的。它是明確的C++標準

7.3.3/8的限制:using聲明的類成員須爲 成員聲明

,但我不知道爲什麼。

我認爲這使語言更加規則,如果它是允許內部類型(類型定義,類等),並定義爲相同

// using Outer::Inner should be identical to 
using Inner = Outer::Inner 

,這是相同的名稱空間的行爲。

我知道這個問題has been asked before,但接受的答案是被禁止的,因爲標準是這樣說的。我想知道它背後是否有任何技術原因。在一個評論,它說,

制定標準(因此所有的編譯器)更復雜的 處理,有一個方便的解決方法的不尋常的案件只是不 通過成本效益的測試。

我會說這是一個意見,而不是一個論點。改變它使語言變得更加統一是一個巨大的好處。現在,你必須教同樣的事情做不同的事情。如果刪除該子句,則標準將變得更簡單,這既是因爲尺寸縮小了,也是因爲刪除了(接縫任意)特殊情況。

更確切地說,我在尋找技術原因爲什麼這是不允許的,例如,這會造成模棱兩可或其他問題。

+1

這也是被接受的答案。 Quote:'使標準(並因此所有的編譯器)更復雜,以處理一個有一個方便的解決方法不尋常的情況下,只是沒有通過成本效益測試。' – user2079303

+0

@ user2079303我已經擴展了答案與我的論點爲什麼這情況並非如此。 – Jens

+0

我沒有看到你正在尋找的東西,但這個問題還沒有被涵蓋。我正在關閉作爲一個笨蛋。如果你真的想得到更多的細節,請給它一個獎勵,但你不會得到任何。 –

回答

1

不要混淆使用聲明和別名聲明。 using A = B;別名聲明,其語義是相同的一個typedef:

甲 的typedef名 也可以通過一個 別名聲明 引入。所述 標識符 的 使用 關鍵字 以下成爲 的typedef名 和可選 屬性說明符-SEQ 繼 標識符 appertains到 的typedef名 。它具有與 typedef 說明符所引入的相同的語義。特別是,它 沒有定義新的類型,它不應出現在 type-id 中。

所以,你寫using Inner = Outer::Inner,因爲它是一樣的typedef Outer::Inner Inner,不只是typedef Outer::Inner。一個別名聲明爲一個類型名稱創建一個別名。

using聲明,在另一方面,是不同的東西:它引入了一個名字進入範圍(7.3.3/1),但它也由字using,這是有點混亂調用。

所以,

//使用外::內使用內=外應該是相同的 ::內

它們不能是相同的,它們是不同的事情。

+0

我指的是使用聲明,例如'使用命名空間std :: chrono :: miliseconds',將名稱導入當前範圍。現在,我希望能夠在'使用Inner :: Outer'方法中做到這一點,這在成員聲明中是可能的,但不能在作用域塊中使用。我想知道爲什麼,因爲我沒有看到這個原因。別名聲明將是預期的語義。 – Jens