之間不同的輸出考慮下面的例子:窄化int在SFINAE BOOL,gcc和鐺
template<int i>
struct nice_type;
template<class T>
struct is_nice : std::false_type {};
template<int i>
struct is_nice< nice_type<i> > : std::integral_constant<int, i> {};
template<class T, class = void>
struct pick
{
typedef std::integral_constant<int, -1> type;
};
template<class T>
struct pick<T, typename std::enable_if< is_nice<T>::value >::type >
{
typedef std::integral_constant<int, is_nice<T>::value > type;
};
int main()
{
std::cout << pick<int>::type::value << ", ";
std::cout << pick< nice_type<42> >::type::value << std::endl;
return 0;
}
鏘(3.4.1)輸出 「1,-1」,而GCC(4.9.0)輸出「-1,42」。
問題存在於pick
的專業化中。雖然海灣合作委員會似乎很樂意將is_nice<T>::value
(42)轉換爲bool(true)
,但clang並沒有這樣做,並放棄了專業化。這兩個示例均使用-std=c++11
編譯。
哪個編譯器是正確的?
您的意思是'nice_type',而不是'cool_type'在第8行? –
@RSahu是的,對不起。 – sbabbi
那是什麼? –