2014-06-05 12 views
6

मेरे पास फ़ंक्शन टेम्पलेट पैरामीटर प्रकार कटौती प्रक्रिया के बारे में कोई प्रश्न है।ब्रेस्ड-इनिट-सूचियां और फ़ंक्शन टेम्पलेट प्रकार कटौती ऑर्डर

इस उदाहरण लें:

#include <vector> 
#include <sstream> 
#include <string> 
#include <iterator> 
#include <fstream> 

int main() 
{ 
    std::ifstream file("path/to/file"); 
    std::vector<int> vec(std::istream_iterator<int>{file},{}); // <- This part 
    return 0; 
} 

अगर मैं चीजों को सही ढंग से समझ, दूसरा पैरामीटर प्रकार std::istream_iterator जिनमें से डिफ़ॉल्ट निर्माता कहा जाता है की होने के लिए निष्कर्ष निकाला है। के बाद से पहली पैरामीटर प्रकार std::istream_iterator<int> दूसरा पैरामीटर std::istream_iterator<int> के रूप में भी निष्कर्ष निकाला है और इसलिए वर्दी प्रारंभ अर्थ विज्ञान लागू किया जा सकता के रूप में निष्कर्ष निकाला है

template <class InputIterator> 
     vector (InputIterator first, InputIterator last, 
       const allocator_type& alloc = allocator_type()); 

:

उचित std::vector निर्माता के रूप में घोषित किया गया है। मुझे इस बारे में कोई जानकारी नहीं है कि किस तरह की कटौती होती है। मैं वास्तव में इस पर कुछ जानकारी की सराहना करता हूं।

अग्रिम धन्यवाद!

+0

यह काम करता है? यदि ऐसा है तो पहले सबसे पहले कटौती की जानी चाहिए। मैं इसे कैसे सहज देख रहा था – Dani

उत्तर

9

के एक भी सरल उदाहरण देखें:

template<class T> 
void foo(T, T); 

foo(42, {}); 

समारोह कॉल दो तर्क है:

  • प्रकार int (एक पूर्णांक शाब्दिक)
  • एक braced-init के prvalue अभिव्यक्ति -सूची{}

उत्तरार्द्ध, {}, अभिव्यक्ति-सूची का हिस्सा हो सकता है लेकिन यह अभिव्यक्ति स्वयं नहीं है। एक अभिव्यक्ति-सूची को प्रारंभकर्ता-सूची के रूप में परिभाषित किया गया है। ब्रेस्ड-इनिट-सूचियां में कोई प्रकार नहीं है।

प्रत्येक फ़ंक्शन पैरामीटर के लिए अलग-अलग [temp.deduct.type]/2 के लिए टेम्पलेट प्रकार की कटौती की जाती है। [Temp.deduct.call] एक समारोह पैरामीटर P के लिए प्रकार कटौती के बारे में/1 कहता है:

तो P से संदर्भ और सीवी-क्वालिफायर को दूर करने देता है std::initializer_list<पी '> कुछ पी के लिए' और तर्क प्रारंभकर्ता सूची है, फिर प्रारंभिक सूची के प्रत्येक तत्व के लिए कटौती की जाती है, पी फ़ंक्शन टेम्पलेट पैरामीटर प्रकार और प्रारंभकर्ता तत्व को इसके तर्क के रूप में लेता है। अन्यथा, प्रारंभकर्ता सूची तर्क पैरामीटर को गैर-अनुमानित संदर्भ माना जाता है। [जोर मेरा]

तो कॉल foo(42, {}); में T दूसरा तर्क {} से निष्कर्ष निकाला नहीं किया जाएगा। हालांकि, पहले तर्क से T को घटाया जा सकता है।

सामान्य तौर पर हम कई समारोह मापदंडों से T यह मान सकते हैं। उस स्थिति में, प्रयुक्त प्रकारों को बिल्कुल [temp.deduct.type]/2 से मेल खाना होता है। कोई समस्या नहीं है (एक और समारोह पैरामीटर एक गैर-निष्कर्ष निकाला संदर्भ में यह है कि, वापसी प्रकार आदि में में) यदि प्रकार केवल एक समारोह पैरामीटर से निष्कर्ष निकाला लेकिन प्रयोग किया जाता है कहीं और नहीं है। टाइप कटौती विफल हो सकती है उदा। जब टेम्पलेट पैरामीटर से किसी भी समारोह पैरामीटर निष्कर्ष निकाला नहीं जा सकता है और स्पष्ट रूप से सेट नहीं है।

कटौती के बाद, Tint द्वारा प्रतिस्थापित किया जाएगा, एक समारोह हस्ताक्षर के समान उत्पादन:

void foo<int>(int, int); 

इस समारोह दो तर्क 42 और {} साथ कहा जा सकता है। उत्तरार्द्ध एक प्रति-सूची-प्रारंभिकता करेगा जो दूसरे पैरामीटर के मूल्य-प्रारंभिकता के लिए अग्रणी होगा।

+0

यह कम या ज्यादा है। चीज़ों को साफ़ करने के लिए धन्यवाद। – Veritas

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