7

此代码是有效的 C++(11) 吗?

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

typedef Derived3::nested<int> xxx;

我知道的

上面的代码无法编译:

  • 苹果 LLVM 5.0 (clang-500.2.75)
  • 铿锵声 3.4

但它成功编译:

  • gcc 4.9.0 20131110(实验性)
  • 海合会 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 回答