2017-10-06 27 views
8

एक उदाहरण पर विचार है:यह गारंटी है कि टेम्पलेट टेम्पलेट पैरामीटर आह्वान उपयोगकर्ता प्रदान की कटौती गाइड

#include <type_traits> 
#include <string> 

template <template <class> class TT> //#1 
struct Foo { 
    static void foo() { 
     static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>); 
    } 
}; 

template <class T> 
struct Bar { 
    Bar(T) {} 
}; 

template <class T> 
Bar(T) -> Bar<std::string>; //#2 

int main() { 
    Foo<Bar>::foo(); 
} 

[clang] के साथ-साथ [gcc] दोनों उपयोगकर्ता प्रदान की कटौती गाइड का उपयोग करने लगते हैं (# 2) जब टेम्पलेट के टेम्पलेट पैरामीटर बात का अनुमान लगाना टेम्पलेट पैरामीटर (# 1)। क्या यह एक मानक अनुपालन सुविधा है?

उत्तर

4

हां, यह मानक अनुपालन है।

[dcl.type.simple]/2 के अनुसार:

एक प्रकार-विनिर्देशक रूप typename ऑप्ट केनेस्टेड-नाम-विनिर्देशक ऑप्टटेम्पलेट नाम एक deduced वर्ग प्रकार के लिए एक प्लेसहोल्डर है ([dcl.type.class.deduct])। टेम्पलेट-नाम एक क्लास टेम्पलेट का नाम देगा जो इंजेक्शन-क्लास-नाम नहीं है।

और [temp.param]/3:

एक प्रकार पैरामीटर जिसका पहचानकर्ता एक अंडाकार का पालन नहीं करता इसके पहचानकर्ता को परिभाषित करता है एक typedef नाम (यदि template बिना घोषित) या टेम्पलेट नाम होने के लिए टेम्पलेट घोषणा के दायरे में (यदि template के साथ घोषित किया गया है)।

TT एक प्रकार पैरामीटर template साथ की घोषणा की, जो इसे एक टेम्पलेट नाम और इसलिए एक deduced वर्ग प्रकार के लिए एक प्लेसहोल्डर बना देता है। सभी सामान्य नियम ठीक लागू होते हैं।

+0

मुझे वास्तव में उस उत्तर की उम्मीद थी, लेकिन अगर यह गलत हो गया .. तो मैं इसे वापस ले जाऊंगा;) –

+0

एक तरफ थोड़ा सवाल है: आपको लगता है कि स्वत: कटौती मार्गदर्शिकाओं को या तो लागू नहीं किया जाना चाहिए? –

+0

@ डब्ल्यूएफ। ठीक है, मैं पूरी तरह से जवाब फिसल गया :) – Barry

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