1

以下使用声明的意义是什么

using eoPop<MOEOT>::size;
using eoPop<MOEOT>::operator[];
using eoPop<MOEOT>::back;
using eoPop<MOEOT>::pop_back;

取自此处定义的类。当然,因为eoPop<EOT>继承std::vector<EOT>、方法size、和是公共的operator[],所以不需要 using 声明。using 声明是否用于强制实例化?backpop_back

4

1 回答 1

2

虽然我不知道他们为什么决定包含那些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,则派生类中的成员函数只会隐藏基类中的每个重载(具有相同名称)。据我所知,链接代码中没有使用它。

于 2013-10-12T21:36:38.863 回答