此代码失败,在大多数编译器来编译,但起初我直觉预期SFINAE保护我:
typedef void (*A)();
template < typename T >
struct a_metafun { typedef typename T::type type; };
template < typename T >
typename a_metafun<T>::type f(T) {}
template < typename T>
void f(T(*)()) {}
int main() { f(A()); }
我可以以至少两种方式解决这个问题:
1)改变的 “metafun” F()来定义的:
template < typename T > typename T::type f(T) {}
2)定义“a_metafun”,使得它分析T和具有类型,如果T具有一个,并且不如果它不...但没有错误无论哪种方式实例:
BOOST_MPL_HAS_XXX_TRAIT_DEF(type)
typedef < template T, bool = has_type<T>::value >
struct a_metafun { };
typedef < template T >
struct a_metafun<T, true> { typedef typename T::type type };
在准确的条件下可以SFINAE申请什么看14.8.2(C ++ 03),它看起来对我来说,它指定。 有没有更好的地方去寻找? 已经推导出模板实例中失败,即使在别人的演绎,似乎没有被列入这份名单。
我采取的解释是什么使这个非法的另一个方向是a_metafun扣除已经发生及其内脏的实例是什么原因造成的错误。 SFINAE实例化过程中,但只有在扣除不适用,还是我错在那里? 尽管在第二种情况下,a_metafun被正确和公formedly实例化,但是它只是内没有“类型”的定义,这意味着该模板试图初始化它未能由于置换。
基本上,我想知道在什么标准的规定,我看到的行为。 每一个编译器我试过抱怨,甚至科莫。 我认为,他们这样做的正确的,我只是不完全确定,为什么。
因此,专家们...什么是什么? 为什么类型的实例,即使在F中扣除的情况下()导致一个错误,而不是排斥SFINAE?