2011-05-15 114 views
1

我有一個(相對)簡短的代碼示例在這裏。MSVC10 SFINAE導致致命的錯誤,而不是替代失敗

#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上,這個代碼的行爲與預期完全一致,並且乾淨地編譯。

+7

他們錯誤地實現了SFIAFE :( – 2011-05-15 16:28:15

回答

1

clang編譯和運行您的代碼沒有抱怨。

+0

什麼版本,哪個C++ stdlib? – Nils 2011-05-16 08:29:03

+0

我運行了一個非常接近trunk-tip和libC++的東西。 – 2011-05-16 13:07:30

+0

在GCC 4.6中編譯也很好。 – 2011-06-15 22:17:33