7

このコードは有効な C++(11) ですか?

struct Base {
    template <typename>
    struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };

typedef Derived3::nested<int> xxx;

私が知っていること

上記のコードは、次の場合にコンパイルに失敗します:

  • Apple LLVM 5.0 (clang-500.2.75)
  • クラン 3.4

しかし、それは正常にコンパイルされます:

  • gcc 4.9.0 20131110 (実験的)
  • gcc 4.8

また、nested型を非テンプレート型に変更すると、つまり

struct Base {
    struct nested;
};
...
typedef Derived3::nested xxx;

その後、上記のコンパイラで動作します。

[編集]nestedテンプレート構造体をテンプレート エイリアスに変更しても何も変わりません 。

template <typename> struct dependent { struct type; };
struct Base {
    template <typename T>
    using nested = typename dependent<T>::type;
};

上記のコンパイラで同じ結果が得られます。 [編集終了]

N3242 §10.1 [class.mi] より

クラスは、複数回間接基本クラスになることができ、直接および間接基本クラスになることができます。このようなクラスでできることは限られています。直接基底クラスの非静的データ メンバーおよびメンバー関数は、派生クラスのスコープ内で参照できません。ただし、静的メンバー、列挙型、および型は明確に参照できます。

コードが有効であることを意味すると思いますが、よくわかりません。

4

1 に答える 1

0

GCC は正しいか、より役立つかのどちらかです (標準に非常に強く準拠しています)。

メンバーではなく型について話しているため、定義があいまいになる理由がわかりません.C ++で名前が等しい場合、型は等しいです(名前は、関与する型のマングルされた形式などです)

補遺:

もう一方のベースの「入れ子」と「入れ子」が違うとダメです。これは構造体であり、typedef または using (スコープが設定されている) ではありません。

GCC は、何かがあいまいな場合に泣き言を言います。そうでない場合でもビッチにしたい場合は、-pedantic を試してください。GCCが単に寛容であっても、これを拒否すべき理由はわかりません。

于 2013-11-14T19:05:03.230 に答える