c – SFINAEd-out函数是否影响基类中显式导入的重载
在使用另一个设计进行了麻烦之后,我决定做一个包装类,为基类的一些成员函数添加重载,当且仅当基类中不存在可行的重载时.基本上,这是我正在努力做的:
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出来.这是错误信息:
那么谁是对的?这个代码是否应该像cl be一样被拒绝,还是应该工作并调用bar :: foo? 解决方法
考虑§10.2:
和§7.3.3
显然,您的示例中唯一的区别在于返回类型.因此,Clang是正确的,并且GCC被窃取. 这个措辞是由CWG #1764提出的:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |