के बीच विभिन्न उत्पादन निम्न उदाहरण पर विचार करें:संकुचन पूर्णांक SFINAE में bool करने के लिए, जीसीसी और बजना
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", जबकि जीसीसी (4.9.0) आउटपुट "-1, 42"।
समस्या pick
की विशेषज्ञता में बताती है। जबकि जीसीसी is_nice<T>::value
(42) से bool(true)
को परिवर्तित करने में प्रसन्न है, क्लैंग ऐसा नहीं करता है, और विशेषज्ञता को त्याग देता है। दोनों उदाहरण -std=c++11
के साथ संकलित किए गए हैं।
कौन सा संकलक सही है?
का मूल्यांकन आपका मतलब है 'लाइन 8 में' cool_type' के बजाय nice_type' करें? –
@RSahu हाँ, क्षमा करें। – sbabbi
इसके लिए क्या है? –