C++ SFINAE可以显式工作,但不能隐式工作

C++ SFINAE可以显式工作,但不能隐式工作,c++,c++11,sfinae,C++,C++11,Sfinae,我正在使用定义了不同枚举集的库的多个不同版本,并尝试在编译时根据是否存在不同的值进行切换。我正在使用decltype()vs…技巧: enum E { FOO = 0, BAR }; template <typename U> inline void add_FOO(std::vector<U>& v, decltype(U::FOO)* ) { std::cout << "YES\n"; } template <ty

我正在使用定义了不同枚举集的库的多个不同版本,并尝试在编译时根据是否存在不同的值进行切换。我正在使用
decltype()
vs
技巧:

enum E {
    FOO = 0,
    BAR
};

template <typename U>
inline void add_FOO(std::vector<U>& v, decltype(U::FOO)* ) {
    std::cout << "YES\n";
}

template <typename U>
inline void add_FOO(std::vector<U>& v, ... ) {
    std::cout << "NO\n";
}
enum E{
FOO=0,
酒吧
};
模板
内联void add_FOO(std::vector&v,decltype(U::FOO)*){

std::cout在我看来像是一个GCC错误。有很多解决方法。例如:

template <typename U>
inline auto add_FOO(std::vector<U>& v, int) -> decltype(U::FOO, void()) {
    std::cout << "YES\n";
}

template <typename U>
inline void add_FOO(std::vector<U>& v, ... ) {
    std::cout << "NO\n";
}

add_FOO(v, 0);
模板
内联自动添加(std::vector&v,int)->decltype(U::FOO,void()){

std::cout用g++4.9.2和clang++3.6.0测试,我得到两次肯定,所以我猜你有一个编译器错误。你在用什么编译器?@rodrigo sigh.4.7.2.4.8也有否定/肯定,所以这看起来像是4.9Hmm中修复的东西,
(E*)nullptr
有效。有趣。我的猜测是GCC 4.7/8认为
nullptr\U t
不是指针类型,并将其称为替换失败,而没有考虑
U
是否在可推断的上下文中。或者,令人惊讶的是,包装
decltype(U::FOO)*
转换为非推导上下文-
模板结构标识{using type=T;};模板使用非_推断=typename identity::type;
并使用
非_推断
,这让我觉得GCC 4.7无论出于什么原因都试图从第二个参数推断U。是的,所有这三个都很好,谢谢。我想我只需要升级。很高兴他们已经修复了它。
template <typename U>
inline auto add_FOO(std::vector<U>& v, int) -> decltype(U::FOO, void()) {
    std::cout << "YES\n";
}

template <typename U>
inline void add_FOO(std::vector<U>& v, ... ) {
    std::cout << "NO\n";
}

add_FOO(v, 0);
template <typename U, decltype(U::FOO)* = nullptr>
inline void add_FOO(std::vector<U>& v, int) {
    std::cout << "YES\n";
}

template <typename U>
inline void add_FOO(std::vector<U>& v, ... ) {
    std::cout << "NO\n";
}

add_FOO(v, 0);