gpt4 book ai didi

C++ using 声明

转载 作者:行者123 更新时间:2023-11-30 04:13:39 28 4
gpt4 key购买 nike

下面的using-declarations有什么意义

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

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

最佳答案

虽然我不知道他们为什么决定包含那些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

In the definition of a class or class template, if a base class depends on a template-parameter, the base class scope is not examined during unqualified name lookup [...].

在链接代码中,我们找到例如 i<size() .姓名size这里是非依赖的,因此不搜索基类范围,并且 eoPop < MOEOT > :: size如果没有 using-declaration 将无法找到。

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

关于C++ using 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19338452/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com