1

我在这里有一个(相对)简短的代码示例。

#include <type_traits>

template<typename T> class function;
template<typename Ret> class function<Ret()> {
public:
    template<typename Func> function(Func f, typename std::enable_if<std::is_same<Ret, decltype(f())>::value, int>::type x = 0) {
    }
};
template<typename Ret, typename A1> class function<Ret(A1)> {
public:
    template<typename Func> function(Func f, typename std::enable_if<std::is_same<Ret, decltype(f(*((A1*)nullptr)))>::value, int>::type x = 0) {
    }
};

namespace lols {
    int x() { return 0; }
    int y(int) { return 0; }
}
void func(function<int()>) {}
void func(function<int(int)>) {}

int main() {
    func(&lols::x);
    func(&lols::y);
}

MSVC 抛出这个,说那type不是 的成员enable_if<false, int>,这有点意思。我不明白为什么这会导致致命错误而不仅仅是替换失败 - 在 GCC 上,此代码的行为完全符合预期并且可以干净地编译。

4

1 回答 1

1

clang编译并运行您的代码,没有任何抱怨。

于 2011-05-15T16:30:56.490 回答