[英]Can C++20 concept be used to avoid hiding template function from base class?
我想使用模板专业化来查询派生对象的组件。
下面的代码工作正常。
但是,我是 C++ 新手。
我不确定这样的编译器行为是否可靠,并且需要一些确认。
#include <type_traits>
class B{
public: template<class T> T* get() requires std::is_same_v< T, B>{ //... [X]
return this;
}
};
class C : virtual public B{
public: using B::get;
public: template<class T> T* get() requires std::is_same_v< T, C>{ //... [Y]
return this;
}
};
int main(){
C c;
B* b1=c.get<B>();
C* c1=c.get<C>();
B* b2=c.get<B>();
}
从cppreference ,即使我使用using B::get
,
如果派生类已经有一个具有相同名称、参数列表和限定条件的成员 (Y),则派生类成员隐藏或覆盖(不冲突)从基类引入的成员 (X)。
我试图消化这句话。
请确认这 3 个陈述。
他们都正确吗?
如果是这样,我将依靠这种令人敬畏的行为。
这是在namespace.udecl#14中指定的,强调我的,
当 using-declarator 将基类中的声明带入派生类时,派生类中的成员函数和成员函数模板会覆盖和/或隐藏同名的成员函数和成员函数模板,参数类型列表([dcl .fct]),尾随 requires-clause(如果有) 、cv-qualification 和 ref-qualifier(如果有),在基类中(而不是冲突)。 此类隐藏或覆盖的声明被排除在 using-declarator 引入的声明集中。
至于你的问题,
- [X]&[Y] 具有相同的名称和参数列表。
- 但是 [X] 和 [Y] 的资格是不同的。
- 因此,不会发生隐藏或覆盖。
是的,[X] 和 [Y] 完全相同,除了结尾的 requires 子句。 因此,不会出现隐藏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.