这是 SFINAE 的正确代码(演示):-
template<bool b> class C {
public: template<bool b2=b> typename std::enable_if<b2,void>::type f(){
cout<<"no!!";
}
};
int main() {
//C<false> c1; c1.f(); <-- not compilable (it is good)
C<true> c2; c2.f();
return 0;
}
我对 C++ 很陌生,但仍然不习惯它。
结果,我经常忘记添加::type
:-
public: template<bool b2=b> std::enable_if<b2,void> f(){
cout<<"no!!";
}
不幸的是,即使它是错误的,它也可以编译为<false>
(demo)。
在我糟糕的一天,我什至走得很远:-
public: std::enable_if<b,void> f(){
cout<<"no!!";
}
它仍然可以编译为<false>
!(演示)。
我知道它是如何/为什么是错误的,但我在实践中经常犯这样的错误。
问题:除了编译器警告之外,在这种情况下如何防止编码器错误?
std::enable_if_t
通过不再要求程序员显式引用嵌套类型,C++14 引入了不允许出现这种错误。您可以决定enable_if
完全不再使用自己的代码,甚至可能将其列入您自己的源代码中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句