2012-11-18 146 views
2

以下代碼是否有效?typedef /別名聲明的聲明

struct B{ using X=int; }; 
struct D1:B{ using X=X; }; // (1) 
struct D2:B{ typedef X X; }; // (2) 

我希望D2 :: X的申報點(2),但似乎都GCC 4.8和3.2鏗鏘接受它是兩個X之間。 這是標準行爲嗎?對工作草案/標準的參考將不勝感激。

回答

4

有上using X = X是否應該拿起或定義X的存在潛在已在範圍X的辯論。爲了避免「未知類型」並使其與typedef相似,裁定在其待分配的類型表達式中不可見(,因此不是類似於int x = x,它類似於typedef x x;)。

回想一下,typedef只是與typedef關鍵字前面加上一個正常的聲明。第一個提到的X沒有聲明任何東西,它只是說什麼類型將被別名。這是與using X = X的主要區別,如果委員會決定那樣,那麼可能會在之前宣佈X

但是請注意,您的代碼有有效未定義的行爲,因爲它違反了沒有要求的診斷規則。 3.3.7p1b2

在一個S類使用應指在其上下文相同的聲明和當A名稱爲N在沒有診斷需要一個該規則的衝突S的完成範圍重新評估。

2

typedef聲明中,最終名稱是正在聲明的名稱,這就是聲明的要點。所以第一個X出現在D2::X聲明之前,因此解析爲B::X