MSVC10 SFINAE 导致致命错误而不是替换失败

发布于 2024-11-07 08:36:32 字数 975 浏览 0 评论 0原文

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

#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 的成员,这就是重点。我不明白的是为什么这会导致致命错误而不仅仅是替换失败——在 GCC 上,这段代码的行为完全符合预期并且编译干净。

I've got a (relatively) brief code sample here.

#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 throws on this, saying that type is not a member of enable_if<false, int>, which is kind of the point. What I don't get is why this causes a fatal error instead of just a substitution failure- on GCC this code behaves exactly as expected and compiles cleanly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北风几吹夏 2024-11-14 08:36:33

clang 毫无怨言地编译并运行您的代码。

clang compiles and runs your code without complaint.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文