次のコードは有効ですか?
struct B{ using X=int; };
struct D1:B{ using X=X; }; // (1)
struct D2:B{ typedef X X; }; // (2)
D2 :: Xの宣言のポイントは(2)の2つのXの間にあると思いますが、gcc4.8とclang3.2の両方がそれを受け入れているようです。これは標準的な動作ですか?ワーキングドラフト/標準への参照をいただければ幸いです。
次のコードは有効ですか?
struct B{ using X=int; };
struct D1:B{ using X=X; }; // (1)
struct D2:B{ typedef X X; }; // (2)
D2 :: Xの宣言のポイントは(2)の2つのXの間にあると思いますが、gcc4.8とclang3.2の両方がそれを受け入れているようです。これは標準的な動作ですか?ワーキングドラフト/標準への参照をいただければ幸いです。
using X = X
定義されているものを取り上げるべきか、X
それともX
すでに範囲内にある可能性があるものを取り上げるべきかについての議論がありました。「不明な型」を回避しtypedef
、に類似させるために、定義されているものは、X
割り当てられる型式に表示されないように決定されました(したがって、に類似するのではなく、に類似してint x = x
typedef x x;
います)。
これは、キーワードが付加さtypedef
れた通常の宣言であることを思い出してください。typedef
の最初の言及はX
何も宣言しておらず、どのタイプがエイリアスされるかを示しているだけです。これが、委員会がそのように決定した場合に、以前にusing X = X
宣言できる大きな違いです。X
ただし、必要な診断がないルールに違反しているため、コードの動作は事実上未定義であることに注意してください。3.3.7p1b2
クラスSで使用される名前Nは、そのコンテキストで、Sの完全なスコープで再評価されるときに、同じ宣言を参照するものとします。このルールの違反に対して診断は必要ありません。
宣言では、最終的な名前が宣言されている名前であり、それtypedef
が宣言のポイントです。したがって、最初X
はの宣言の前に来るD2::X
ため、に解決されB::X
ます。