Lou*_*nne 7 c++ gcc multiple-inheritance clang nested-class
这段代码是否有效C++(11)?
struct Base {
template <typename>
struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };
typedef Derived3::nested<int> xxx;
Run Code Online (Sandbox Code Playgroud)
我知道的
上面的代码无法编译:
但它成功编译:
此外,如果我将nested类型更改为非模板类型,即
struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;
Run Code Online (Sandbox Code Playgroud)
然后它适用于上述编译器.
[edit]
将nested模板结构更改为模板别名也不会改变任何内容;
template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};
Run Code Online (Sandbox Code Playgroud)
与上述编译器产生相同的结果. [结束编辑]
来自N3242§10.1[class.mi]
类可以是多个间接基类,可以是直接基类和间接基类.这类课程可以做的事情有限.直接基类的非静态数据成员和成员函数不能在派生类的范围内引用.但是,可以明确地引用静态成员,枚举和类型.
我认为这意味着代码应该是有效的,但我不确定.
很好,GCC 要么是正确的,要么更有帮助(它非常严格地遵守标准)
它不明白为什么定义会含糊不清,因为你谈论的是类型而不是成员,并且如果它们的名称在 C++ 中相等,则类型是相等的(名称是所涉及类型的某种损坏形式等)
附录:
如果“嵌套”和另一个基地的“嵌套”不同,那就是错误的。它是一个结构体,而不是 typedef 或 using (它们是有作用域的)
如果某些内容不明确,GCC 会发出抱怨声,如果你想让它变得很糟糕,即使它不明确,也可以尝试使用 -pedantic。即使海湾合作委员会只是宽容,我认为没有理由拒绝这一点。
| 归档时间: |
|
| 查看次数: |
322 次 |
| 最近记录: |