2017-02-16 6 views
7

cppreference के अनुसार, निम्नलिखित कोड कानूनी है:क्या सी ++ विविध पैरामीटर पैरामीटर के बाद सामान्य पैरामीटर की अनुमति देता है?

template<typename... Args> 
void f(Args&&..., bool) 
{} 

int main() 
{ 
    f(1, 2, 3, true); // error! see below for details. 
} 
1>main.cpp(59,2): error : no matching function for call to 'f' 
1>   f(1, 2, 3, true); 
1>  ^
1> main.cpp(54,6) : note: candidate function not viable: requires 1 argument, but 4 were provided 
1> void f(Args&&..., bool) 
1>  ^
1> 1 error generated. 
:

lock_guard(MutexTypes&... m, std::adopt_lock_t t); 

हालांकि, निम्नलिखित कोड बजना 3.8 के साथ (-std = C++ 1Z) संकलित नहीं किया जा सकता

क्या सी ++ विविध पैरामीटर के बाद सामान्य पैरामीटर की अनुमति देता है?

+1

मेरा कंपाइलर क्लैंग 3.8 है। जीसीसी 6.2 भी विफल रहता है। – xmllmx

+3

ध्यान दें कि 'lock_guard' उदाहरण के साथ, यह एक क्लास कन्स्ट्रक्टर है, इसलिए फ़ंक्शन कॉल तर्कों से उन्हें कम करने की कोशिश करने के बजाय सभी टेम्पलेट तर्क पहले से ज्ञात हैं। – BoBTFish

+0

यह सी ++ 17 है, सी ++ 11 नहीं। – ForEveR

उत्तर

9

अपने कोड में समारोह घोषणा मान्य है, लेकिन कटौती इस तरह के समारोह टेम्पलेट्स के लिए ठीक से काम नहीं करता है। ध्यान दें कि निम्न कोड अच्छी तरह से गठित है, और विशेषज्ञता void f(int, int, int, bool) को दर्शाता है:

template<typename... Args> 
void f(Args&&..., bool) {} 

int main() { 
    f<int, int, int>(1, 2, 3, true); 
} 

ध्यान दें कि में सी ++ 17 MutexTypes... वर्ग ही टेम्प्लेट पैरामीटर हैं:

template <class... MutexTypes> class lock_guard; 
तो वे

ज्ञात हैं और उन्हें कम करने की आवश्यकता नहीं है। ध्यान दें कि adopt_lock_t के साथ कन्स्ट्रक्टर का उपयोग सी ++ 17 वर्ग टेम्पलेट तर्क कटौती के लिए नहीं किया जा सकता है क्योंकि पैरामीटर पैक के बाद adopt_lock_t तर्क होता है। यदि समिति सी ++ 11 में प्रख्यात थी, तो वे अंत में की बजाय शुरुआत में adopt_lock_t तर्क डालते थे, लेकिन हां, अब बहुत देर हो चुकी है।

+1

बहुत देर हो चुकी नहीं है, http://en.cppreference.com/w/cpp/thread/scoped_lock/scoped_lock देखें – user2913094

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