2017-03-10 15 views
9
#include <iostream> 
using namespace std; 

template<typename T> 
void adl(T) 
{ 
    cout << "T"; 
} 

struct S 
{ 
}; 

template<typename T> 
void call_adl(T t) 
{ 
    adl(S()); 
    adl(t); 
} 

void adl(S) 
{ 
    cout << "S"; 
} 

int main() 
{ 
    call_adl(S()); 
} 

में नाम देखने नियमों परिणाम क्यों "टीएस" क्या है? टेम्पलेट फ़ंक्शन के अंदर नाम लुकअप नियम क्या है?टेम्पलेट समारोह

http://ideone.com/sB3DnL

उत्तर

9

टेम्पलेट्स परिभाषा की बात और इन्स्टेन्शियशन के बिंदु पर, दो चरणों में संकलित किया गया है। पहला चरण तब होता है जब टेम्पलेट परिभाषा को पहले संकलक द्वारा संसाधित किया जाता है, और कुछ नाम तुरंत परिभाषाओं के लिए बाध्य होते हैं। टेम्पलेट को तत्काल होने तक कुछ नाम अनबाउंड छोड़ दिए जाते हैं, क्योंकि वे टेम्पलेट पैरामीटर पर निर्भर करते हैं और इसलिए टेम्पलेट तत्काल होने तक टेम्पलेट तर्कों को ज्ञात नहीं किया जा सकता है।

इस कॉल में:

adl(S()); 

कुछ भी नहीं है कि समारोह के टेम्पलेट मानकों के आधार पर निर्भर नहीं है, इसलिए देखने तुरंत (प्रथम चरण के दौरान) किया जाता है और यह केवल समारोह पाता है adl कहा जाता है जो उस बिंदु पर दायरे में है।

इस कॉल में:

adl(t); 

यह निर्भरt और इतने देखने के प्रकार पर इन्स्टेन्शियशन जब तक देरी हो रही है जब t के प्रकार जाना जाता है। जब आप call_adl(S()) फोन adl के दूसरे अधिभार दायरे में है, और इसलिए जब adl(t) कॉल नाम लुकअप करता है वहाँ दायरे में एक और समारोह है, और यह तर्क के लिए एक बेहतर मिलान नहीं है।

+0

तो 'शून्य ADL (एस)' की परिभाषा चरण मैं में संकलक द्वारा नहीं देखा जाता है? – q0987

+0

@ q0987 नहीं, क्योंकि इसे 'call_adl' की परिभाषा और तत्कालता के बीच घोषित किया गया है। – user1937198

+0

@ user1937198, के बाद मैं 'मुख्य' समारोह नीचे 'शून्य ADL (एस)' ले जाया गया। नतीजा अभी भी 'टीएस' है। दूसरे शब्दों में, तत्काल के समय, 'शून्य adl (एस)' अभी तक गुंजाइश में नहीं है। तो परिणाम 'टीएस' क्यों है? http://ideone.com/BApxuL – q0987

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