निम्नलिखित कोड पर विचार करें:वैराडिक कटौती गाइड जी ++ द्वारा नहीं लिया गया है, जो क्लैंग ++ द्वारा लिया गया है - जो सही है?
template <typename... Types>
struct list
{
template <typename... Args>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
};
template <typename... Args>
list(Args...) -> list<Args...>;
int main()
{
list l{0, 0.1, 'a'};
}
मैं उम्मीद करेंगे decltype(l)
list<int, double, char>
किया जाना है। दुर्भाग्य से, जी ++ 7.2 और जी ++ ट्रंक स्थिर दावे में विफल रहता है। क्लैंग ++ 5.0.0 और क्लैंग ++ ट्रंक संकलित और अपेक्षा के अनुसार काम करें।
यह एक जी ++ बग है? या क्या कोई कारण है कि कटौती मार्गदर्शिका का पालन नहीं किया जाना चाहिए?
template <typename... Args,
typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
मैं अपने कोड बीमार का गठन किया जा सकता है ... 'sizeof ... (प्रकार) के लिए लगता है == 0' आपकी टेम्प्लेटेड निर्माता का कोई व्यवहार्य इन्स्टेन्शियशन है ... –
मैं कुछ भी रूप में देखते के लिए संघर्ष कर रहा हूँ एक जीसीसी बग के अलावा। make_list() फ़ंक्शन की पिछली विधि का उपयोग ठीक काम करता है। https://godbolt.org/g/vag3rD –
@ रीचर्डहोड्स स्वाभाविक रूप से आपकी विधि g ++ के साथ 'सूची <> 'को तुरंत चालू करने का प्रयास नहीं करता है। –