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の両方がそれを受け入れているようです。これは標準的な動作ですか?ワーキングドラフト/標準への参照をいただければ幸いです。

4

2 に答える 2

4

using X = X定義されているものを取り上げるべきか、XそれともXすでに範囲内にある可能性があるものを取り上げるべきかについての議論がありました。「不明な型」を回避しtypedef、に類似させるために、定義されているものは、X割り当てられる型式に表示されないように決定されました(したがって、に類似するのではなく、に類似してint x = xtypedef x x;います)。

これは、キーワードが付加さtypedefれた通常の宣言であることを思い出してください。typedefの最初の言及はX何も宣言しておらず、どのタイプがエイリアスされるかを示しているだけです。これが、委員会がそのように決定した場合に、以前にusing X = X 宣言できる大きな違いです。X

ただし、必要な診断がないルールに違反しているため、コードの動作は事実上未定義であることに注意してください。3.3.7p1b2

クラスSで使用される名前Nは、そのコンテキストで、Sの完全なスコープで再評価されるときに、同じ宣言を参照するものとします。このルールの違反に対して診断は必要ありません。

于 2012-11-18T21:39:14.713 に答える
2

宣言では、最終的な名前が宣言されている名前であり、それtypedefが宣言のポイントです。したがって、最初Xはの宣言の前に来るD2::Xため、に解決されB::Xます。

于 2012-11-18T21:27:13.790 に答える