c – SFINAEd-out函数是否影响基类中显式导入的重载

c – SFINAEd-out函数是否影响基类中显式导入的重载,第1张

概述在使用另一个设计进行了麻烦之后,我决定做一个包装类,为基类的一些成员函数添加重载,当且仅当基类中不存在可行的重载时.基本上,这是我正在努力做的: template<typename T>struct wrapper: T{ using T::foo; template<typename Arg> auto foo(Arg) const -> std:: 在使用另一个设计进行了麻烦之后,我决定做一个包装类,为基类的一些成员函数添加重载,当且仅当基类中不存在可行的重载时.基本上,这是我正在努力做的:
template<typename T>struct wrapper: T{    using T::foo;    template<typename Arg>    auto foo(Arg) const        -> std::enable_if_t<not std::is_constructible<Arg>::value,bool>    {        return false;    }};struct bar{    template<typename Arg>    auto foo(Arg) const        -> bool    {        return true;    }};

在这个简单的例子中,包装器只有在基类不可行的情况下才添加一个重载的foo(我简化了std :: enable_if到最简单的事情;原来的一个涉及检测成语).但是,g和clang不同意.请注意以下几点:

int main(){    assert(wrapper<bar>{}.foo(0));}

g是可以的:包装上的foo< bar>是SFINAE出来,所以它使用一个从bar而不是.另一方面,clang++ seems to assume的包装< bar> :: foo总是阴影吧:: foo,即使SFINAEd出来.这是错误信息:

06002

那么谁是对的?这个代码是否应该像cl be一样被拒绝,还是应该工作并调用bar :: foo?

解决方法 考虑§10.2:

In the declaration set,using-declarations are replaced by the set of
designated members that are not hIDden or overrIDden by members of the
derived class (7.3.3),

和§7.3.3

When a using-declaration brings names from a base class into a derived class scope,[…] member function templates in the derived class overrIDe and/or hIDe member functions and member function templates with the same name,parameter-type-List (8.3.5 [dcl.fct]),cv-qualification,and ref-qualifIEr (if any) in a base class (rather than conflicting).

显然,您的示例中唯一的区别在于返回类型.因此,Clang是正确的,并且GCC被窃取.

这个措辞是由CWG #1764提出的:

According to 7.3.3 [namespace.udecl] paragraph 15,

When a using-declaration brings names from a base class into a derived class scope,[…]


10.2中给出了类范围名称查找的算法
[class.member.lookup],但是,没有实现这个要求;
没有什么可以删除隐藏的基类成员(替换)
结果集中的使用声明,第3段).

该决议于2014年2月移交给DR,所以GCC也没有实施.

正如@ TartanLlama的回答中提到的,你可以介绍一个对手来处理其他情况.沿线的东西

template <typename Arg,typename=std::enable_if_t<std::is_constructible<Arg>{}>>decltype(auto) foo(Arg a) const{    return T::foo(a);}

Demo.

总结

以上是内存溢出为你收集整理的c – SFINAEd-out函数是否影响基类中显式导入的重载全部内容,希望文章能够帮你解决c – SFINAEd-out函数是否影响基类中显式导入的重载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存