【发布时间】:2018-07-17 07:46:08
【问题描述】:
在这段代码中
struct A {int commmon; int rare;};
struct B {int commmon;};
struct L {
template<class T>
int f(const T& t) {return t.commmon;}
template<class T>
int f(T& t) {return t.rare;}
};
void func() {
A a; B b; L l;
l.f(a);
l.f(B{});
l.f(b);
}
最后几行给了我错误
In instantiation of ‘int L::f(T&) [with T = B]’:
error: ‘struct B’ has no member named ‘rare’
但是根据我对SFINAE的理解,由于body中的替换失败,第二次重载应该被忽略。为什么不会发生这种情况?
编辑:如果我将第二个重载的返回类型更改为decltype(T::rare),它会做我想要的。那么我的 SF 在哪里需要恰好是 NAE?
【问题讨论】:
-
在这里阅读解释:en.cppreference.com/w/cpp/language/sfinae 简而言之:SF 必须在函数声明中,而不是在主体中。
-
@mch 哇,这个解释比维基百科的解释好多了。
-
您可以使用类似
template<class T> auto f(T& t) -> decltype(t.rare) {return t.rare;}的方式为您的函数启用 SFINAE。