C ++ using-declarations

时间:2013-10-12 19:43:24

标签: c++ using

以下使用声明的重点是什么

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

取自定义为here的班级。当然,因为eoPop<EOT>继承std::vector<EOT>,方法sizeoperator[]backpop_back是公开的,所以不需要使用声明。 using声明是否用于强制实例化?

1 个答案:

答案 0 :(得分: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)。如果隐式实例化所述类模板,则实例化类模板的基类(这反过来导致实例化那些基类模板的成员函数的声明)。因此, using-declaration 对实例化没有帮助。


using-declarations 的效果是声明的名称对于非依赖名称查找是可见的。根据[temp.dep] / 3

  

在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围。

在链接代码中,我们找到了例如i<size()。此处的名称size是非依赖的,因此不会搜索基类范围,如果没有 using-declaration ,则无法找到eoPop < MOEOT > :: size

使用 using-declarations 的另一个原因是,如果要重载基类的成员函数。如果不使用using-decl,派生类中的成员函数只会隐藏基类中的每个重载(具有相同的名称)。据我所知,链接代码中没有使用它。