2015-05-12 10 views
6

के बाद कोड सफलतापूर्वक बजना के साथ संकलित किया गया है, लेकिन जीसीसी में विफल रहता है:जीसीसी डिफ़ॉल्ट टेम्पलेट तर्क में पैक विस्तार स्वीकार नहीं करता है

struct fn 
{ 
    template <typename ... Args> 
     static constexpr bool call (Args ...) { return true; } 
}; 

template <typename ... T> 
    static constexpr bool f = false; 

template <typename ... Ts, bool F = fn::call(f<Ts> ...)> 
    void hoge() {} 

int main() {} 

जीसीसी 5.1.0 (-Wall -Wextra -std = C++ 14 - pedantic) कहते हैं

prog.cc:10:52: error: expansion pattern 'f<Ts>' contains no argument packs 
template <typename ... Ts, bool F = fn::call(f<Ts> ...)> 

क्लैंग 3.6.0 और 3.5.0 कोई त्रुटि नहीं देता है।

क्या मैं और क्लैंग सी ++ नियमों का उल्लंघन कर रहा हूं या यह एक जीसीसी बग है?

उत्तर

4

आपने किसी भी नियम का उल्लंघन नहीं किया है। यह चर टेम्पलेट्स, न केवल डिफ़ॉल्ट तर्क के लिए जीसीसी के समर्थन के साथ एक समस्या हो गया लगता है क्योंकि इस समायोजन काम करता है:

template <typename ... T> 
struct f { 
    static constexpr bool v = false; 
}; 

template <typename ... Ts, bool F = fn::call(f<Ts>::v ...)> 
    void hoge() {} 

http://coliru.stacked-crooked.com/a/ff81b6ab052a748b

जहाँ तक मुझे पता है, एक चर टेम्पलेट एक वर्ग टेम्पलेट के बराबर है एक स्थिर सदस्य को लपेटना, इसलिए ::v लिखने के अलावा इसे किसी भी समस्या का कारण नहीं बनना चाहिए।

संबंधित मुद्दे