虽然我不知道他们为什么决定包含那些using-declarations,但我可以说出为什么没有它们代码会是错误的。
但首先,从评论中重复:
using-declaration不需要存在指定实体的定义(这里:它不需要存在这些函数的定义)。考虑:
void foo();
int main()
{
using ::foo; // doesn't require the definition of `foo` to exist
return 0;
}
如果类模板被隐式实例化,则实例化其成员函数的声明,但不实例化它们的定义(根据 [temp.inst]/1)。如果类模板被隐式实例化(这反过来导致这些基类模板的成员函数声明的实例化),则类模板的基类也会被实例化。因此,使用声明对实例化没有帮助。
这些使用声明的效果是声明的名称对于非依赖名称查找是可见的。根据 [temp.dep]/3
在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围 [...]。
在链接的代码中,我们找到了 example i<size()
。这里的名称size
是非依赖的,因此不会搜索基类范围,eoPop < MOEOT > :: size
如果没有using-declaration就找不到。
使用using 声明的另一个原因是,如果您想重载基类的成员函数。如果不使用 using-decl,则派生类中的成员函数只会隐藏基类中的每个重载(具有相同名称)。据我所知,链接代码中没有使用它。