2017-11-14 5 views
12

आज मैं क्लैंग के सी ++ 17 समर्थन पृष्ठ को पढ़ रहा था। मैंने कुछ अजीब देखा है। सुविधा संगत तर्कों के लिए मिलान टेम्पलेट टेम्पलेट पैरामीटर (P0522R0) को आंशिक के रूप में चिह्नित किया गया है, क्योंकि यह स्विच के माध्यम से सक्रिय होना चाहिए। उनकी टिप्पणी says:P0522R0 ब्रेकिंग कोड कैसा है?

एक दोष रिपोर्ट करने के लिए संकल्प होने के बावजूद, इस सुविधा बजना 4 में सभी भाषा संस्करण में डिफ़ॉल्ट रूप से अक्षम है, और ध्वज के साथ स्पष्ट रूप से सक्रिय किया जा सकता -frelaxed-टेम्पलेट टेम्पलेट आर्ग मानक में परिवर्तन टेम्पलेट आंशिक क्रम के लिए एक समान परिवर्तन की कमी है, जिसके परिणामस्वरूप उचित और पूर्व-मान्य कोड के लिए अस्पष्टता त्रुटियां होती हैं। इस मुद्दे को जल्द ही सुधारने की उम्मीद है।

इस सुविधा को सक्रिय करते समय किस प्रकार की संरचना टूट जाती है? यह कोड क्यों तोड़ सकता है और कैसे? क्योंकि foo केवल एक टेम्पलेट पैरामीटर के साथ एक टेम्पलेट लेता है, और न दो,

template<template<typename> typename> 
struct Foo {}; 

template<typename, typename = void> 
struct Bar {}; 

Foo<Bar> unused; 
दोष संकल्प के बिना

, unused हैं बीमार का गठन किया जा:

उत्तर

12

आप इस तरह कोड हो सकता है। यदि आप इस पर भरोसा करते हैं (शायद SFINAE के लिए):

template<template<typename> typename> 
void foo(); 

template<template<typename, typename> typename> 
void foo(); 

template<typename, typename = void> 
struct Bar {}; 

int main() { 
    foo<Bar>(); // ambiguous after resolution! 
} 

फिर कॉल विफल हो जाएगा! समस्या यह है कि आंशिक क्रम में कोई समान परिवर्तन नहीं था, और इसलिए दोनों उम्मीदवारों के कार्यों में समान व्यवहार्यता है, और कॉल संदिग्ध है।

+0

ओह मैं देखता हूं। आपके उदाहरण में, मुझे उम्मीद है कि 'foo' के दूसरे संस्करण को उठाया जाएगा। –

+6

@ गुइलाउम हां, क्योंकि यह एक बेहतर मैच है। लेकिन मानक के लिए आंशिक क्रम में पाठ नहीं है :( – Rakete1111

+3

मैंने इस बारे में SO पर कुछ प्रश्न देखे हैं, और यहां तक ​​कि इसे स्वयं भी चलाते हैं। मुझे लगता है कि सबसे आम परिदृश्य यह है कि कोई कंटेनर लपेट रहा है , विशेष रूप से 'std :: vector', और वे भूल जाते हैं कि इसमें एक आवंटक भी है, इसलिए आप [this] (https://wandbox.org/permlink/lYy8DNiF61ZH4Fmp) जैसे कोड के साथ समाप्त होते हैं – AndyG

3

एक और अधिक आम परिदृश्य है जब कुछ कोड, उदा

template<class> struct Foo; 

template<template<class> class X, class T> 
struct Foo<X<T>> { /* ... */ }; 

template<template<class, class> class X, class T, class U> 
struct Foo<X<T, U>> { /* ... */ }; 

// etc., etc. 

Foo<std::vector<int>> अब एक उपयुक्त आंशिक आदेश ठीक बिना बीमार बनाई है आंशिक विशेषज्ञताओं का एक सेट के साथ टेम्पलेट तर्क का निरीक्षण करना चाहता है .: है।

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