2016-10-07 6 views
8

P0091R3 ("Template argument deduction for class templates") हाल ही में gcc trunk में जोड़ा गया था और wandbox पर परीक्षण किया जा सकता है।कक्षा टेम्पलेट्स के लिए सी ++ 17 का "टेम्पलेट तर्क कटौती" स्थानीय प्रकारों को कम कर सकता है?

कुछ मैं मन में था इसे का उपयोग कोड के बहुत कुछ पंक्तियों में एक "गुंजाइश गार्ड" को लागू करने की संभावना थी:

scope_guard _([]{ cout << "hi!\n" }); 

मैं implementing it on wandbox कोशिश की ...

template <typename TF> 
struct scope_guard : TF 
{ 
    scope_guard(TF f) : TF{f} { } 
    ~scope_guard() { (*this)(); } 
}; 

int main() 
{ 
    scope_guard _{[]{}}; 
} 

... लेकिन संकलन निम्न त्रुटि के साथ विफल रहा:

prog.cc:6:5: error: 'scope_guard(TF)-> scope_guard<TF> [with TF = main()::<lambda()>]', declared using local type 'main()::<lambda()>', is used but never defined [-fpermissive] 
    scope_guard(TF f) : TF{std::move(f)} { } 
    ^~~~~~~~~~~ 

मैं तो using a non-lambda local type की कोशिश की, और एक ही त्रुटि मिली।

int main() 
{ 
    struct K { void operator()() {} }; 
    scope_guard _{K{}}; 
} 

बाद में, I tried a non-local type, और यह उम्मीद के रूप में काम किया।

struct K { void operator()() {} }; 

int main() 
{ 
    scope_guard _{K{}}; 
} 

इस इस तरह से कि स्थानीय प्रकार निष्कर्ष निकाला होने से रोकती है में बनाया गया चित्रित किया है?

या क्या यह सुविधा के gcc के वर्तमान कार्यान्वयन में एक दोष है?

+1

ऐसा लगता है कि आप पहले से ही बग रिपोर्ट पर पाए गए हैं और टिप्पणी की है। – Barry

उत्तर

7

यह वर्तमान कार्यान्वयन में एक बग है: 77890 ( नई वैधता का तात्पर्य, के रूप में अपुष्ट 7.0 में तय करने का विरोध किया)। एक लैम्ब्डा अनुमान करने में सक्षम होने के नाते मूल कागज के प्रेरित करने उदाहरणों में से एक था, इसलिए काफी अजीब हो अगर यह काम नहीं किया जाएगा:

// Virtually impossible to pass a lambda to a template class' constructor without declaring the lambda 
for_each(vi2.begin(), vi2.end(), Foo<???>([&](int i) { ...})); 
for_each(vi.begin(), vi.end(), Foo([&](int i) { ...})); // Now easy instead of virtually impossible 

हम एक बहुत बुनियादी उदाहरण बना सकते हैं:

template <class TF> scope_guard<TF> synthesized(TF); 
template <class TF> scope_guard<TF> synthesized(scope_guard<TF> const&); 
template <class TF> scope_guard<TF> synthesized(scope_guard<TF>&&); 
:
template <typename TF> 
struct scope_guard 
{ 
    scope_guard(TF) { } 
}; 

int main() 
{ 
    scope_guard _([]{}); 
} 

यह संश्लेषित समारोह सेट कार्यों से मिलकर पर अधिभार संकल्प प्रदर्शन करना चाहिए

जो पहले अधिभार को चुनना चाहिए और _ के प्रकार के रूप में उस वापसी प्रकार का उपयोग करें, TF लैम्ब्डा के प्रकार के साथ। यह सब काम करना चाहिए।

+0

[मूल स्निपेट अब ** wandbox ** पर संकलित करता है] (http://melpon.org/wandbox/permlink/DOEBWFOU6YyKLPYe)। –

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