名称在类定义的一部分中引用基类成员和在另一部分引用类成员是否合法?此代码演示了它:
struct Base
{
typedef int T;
};
struct Derived : Base
{
T m1; //type int
typedef T *T;
T m2; //type int*
};
我无法在标准中找到针对此的裁决。代码合法吗?
答案 0 :(得分:2)
幸运的是,在这种情况下,它是否合法并不重要(我相信它的结构良好,因为typedef被允许阴影)因为你可以做一个微小的重构更改并且代码变得非常明显:
struct Derived : Base
{
typedef Base::T BaseT;
typedef BaseT* T;
BaseT m1; //type int
T m2; //type int*
};
答案 1 :(得分:1)
我认为它是合法的(typedef
肯定会按照它们出现的顺序处理),但是对于任何试图在将来阅读代码的人来说,这将是非常混乱的。
重命名次要类型会更有意义:
typedef T *Tptr;
Tptr m2;
答案 2 :(得分:1)
是的,这是合法的。我不会就是否合理做出评论。
首先,您需要能够在派生类中重新声明具有相同名称的其他实体;这是允许的3.3.10 / 1(我强调):
可以通过嵌套声明性区域或派生类中相同名称的显式声明来隐藏名称。
然后,您需要T
在Base::T
的声明中引用Derived::T
;即Derived::T
在此时不得在范围内。范围由3.3.3 / 1定义:
它的潜在范围从其声明点开始,并在其阻止结束时结束。
,声明点由3.3.2 / 1定义:
名称的声明点紧跟在其完整的声明者之后
意味着,在声明者之前和期间,Derived::T
不在范围内,因此T
指的是Base::T
。