此代码是有效的 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]
一个类可以多次作为间接基类,并且可以是直接基类和间接基类。这样的课程可以做的事情有限。不能在派生类的范围内引用直接基类的非静态数据成员和成员函数。但是,可以明确地引用静态成员、枚举和类型。
我认为这意味着代码应该是有效的,但我不确定。