以下代碼是否有效?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之間。 這是標準行爲嗎?對工作草案/標準的參考將不勝感激。
以下代碼是否有效?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之間。 這是標準行爲嗎?對工作草案/標準的參考將不勝感激。
有上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的完成範圍重新評估。
在typedef
聲明中,最終名稱是正在聲明的名稱,這就是聲明的要點。所以第一個X
出現在D2::X
聲明之前,因此解析爲B::X
。