2014-10-16 10 views
6

C++ में अगर मैं एक सामान्य कार्य है:सी ++ में स्ट्रिंग अक्षर के लिए प्रकार का कटौती कैसे काम करता है?

template <typename T> 
void func(T& s) 
{ 
    std::cout << "in generic\n"; 
    std::cout << typeid(s).name(); 
} 

Ttypeid(s).name() को निष्कर्ष निकाला जाएगा।

लेकिन यह कैसे करता है, तो मुझे क्या करना आते हैं: सामान्य समारोह काम करता है

func("test"); 

यही कारण है, लेकिन यह एक नहीं करता है:

void func(const char*& s) 
{ 
    std::cout << "in overloaded\n"; 
    std::cout << typeid(s).name(); 
} 

मुझे पता है कि यह अगर मैं const char*&const char* को बदलने के लिए काम करेंगे या ओवरलोडेड फ़ंक्शन के हस्ताक्षर में const char* const&, और यदि मैं अधिभारित फ़ंक्शन पर कोई तर्क पारित करना चाहता हूं तो यह अस्थायी होना चाहिए। मुझे समझ में नहीं आया कि T& के साथ क्या हुआ, क्या इसे कटौती के बाद const char*& में बदलना नहीं चाहिए?

उत्तर

4

स्ट्रिंग अक्षरकांक वर्णों के सरणी हैं। टेम्पलेट समारोह इस तरह कहा जाता है के मामले में तो:

func("test"); 

Tchar const[5] के रूप में निष्कर्ष निकाला गया है। और s स्ट्रिंग अक्षर का संदर्भ है, और इसका प्रकार char const (&)[5] है। यही है, 5 कॉन्स चार की सरणी का संदर्भ।

+0

और चार कॉन्स (&) [5] चार के लिए कॉन्स संदर्भों की एक सरणी है? – Pavel

+2

@ पुलपॉल 1076: नहीं। यह 5 कॉन्स चार की सरणी का संदर्भ है। शब्दों में सूक्ष्म अंतर, लेकिन काफी महत्वपूर्ण (एक बात के लिए, आपके पास संदर्भों की एक सरणी नहीं हो सकती है)। –

+0

धन्यवाद आदमी, अब मुझे यह लगता है कि – Pavel

4

"test" का प्रकार const char[5] है। फ़ंक्शन टेम्पलेट को कॉल करते समय और संदर्भ प्रकार के पैरामीटर को कम करने के लिए तर्क का उपयोग करते समय, सरणी-से-पॉइंटर रूपांतरण होता है। तो सामान्य समारोह T deduces const char[5] होने के लिए - आप देख सकते हैं कि "test" के लिए और एक const char* के लिए उत्पादन भिन्न होता है:

template<typename T> 
void func(T& s){ 

    std::cout << "in generic\n"; 
    std::cout << typeid(s).name() << '\n'; 
} 

int main() 
{ 
    func("test"); 
    const char *c = "test"; 
    func(c); 
} 

GCC output:

in generic 
A5_c 
in generic 
PKc 

दूसरी ओर, गैर सामान्य समारोह में , आप const char पर गैर-कॉन्स्ट पॉइंटर का संदर्भ चाहते हैं। लेकिन, जैसा कि "test" के प्रकार const char[5] है, यह सरणी-टू-सूचक रूपांतरण, जिसका अर्थ है कि जिसके परिणामस्वरूप const char* एक अस्थायी (एक rvalue) है गुजरना करने के लिए है। इस प्रकार, यह गैर-कॉन्स के संदर्भ से जुड़ नहीं सकता है।

+1

+1 जीसीसी और क्लैंग का विस्तार +1 करता है, सुंदर-फ़ंक्शन मैक्रो टेम्पलेट पैरामीटर के साथ इसे उजागर करने का विशेष रूप से अच्छा काम करता है। [** इसे लाइव देखें **] (http://ideone.com/pZO23A) – WhozCraig

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