2017-08-25 11 views
6

मुझे सी ++ टेम्पलेट्स के बारे में कोई प्रश्न है। निम्नलिखित कोड segfaults।सी ++ टेम्पलेट्स में segfault

template <typename T1, typename T2> 
inline T1 const& max(T1 const &a, T2 const &b) { 
    return a < b ? b : a; 
} 
int main() { 
    std::cout << max(4.9, 4) << std::endl; 
} 

हालांकि, & को हटा कर उसे सही काम करता है।

template<typename T1, typename T2> 
inline T1 const max(T1 const &a, T2 const &b) { 
    return a < b ? b : a; 
} 
int main() { 
    std::cout << max(4.9, 4) << std::endl; 
} 

इसके अलावा, केवल टी 1 और टी 2 के बजाय टी का उपयोग करें और यह ठीक काम करता है।

template<typename T> 
inline T const& max(T const &a, T const &b) { 
    return a < b ? b : a; 
} 

int main() { 
    std::cout << max(4, 5) << std::endl; 
} 

मैं यहां क्या गलत कर रहा हूं?

+0

कृपया बताएं कि संस्करण संख्या सहित आप किस कंपाइलर का उपयोग कर रहे हैं। यदि यह जीसीसी है, तो क्या आपने '-वॉल' के साथ संकलित किया है? ऐसी चेतावनी हो सकती है जिसे आप अनदेखा कर रहे हैं जो अपरिभाषित व्यवहार कर रहा है। –

+0

कंपाइलर आपको अस्थायी के अधिकतम() कॉल रिटर्न संदर्भ बताएगा। – tristan

+1

पहले दो कोड स्निपेट समान हैं? – asimes

उत्तर

10

आपको हमेशा चेतावनियों के साथ संकलित होना चाहिए, https://wandbox.org/permlink/KkhFOJw6QNJ7rv7J देखें। अगर आपके पास चेतावनी झंडे थे, तो कंपाइलर ने आपकी मदद की होगी और आपको बताया होगा कि आप क्या गलत कर रहे हैं।

यहां क्या हो रहा है एक पदोन्नति है (Return type of '?:' (ternary conditional operator) देखें), आप int और double पर एक टर्नरी अभिव्यक्ति निष्पादित कर रहे हैं। ऐसा करने से अस्थायी प्रचारित double में परिणाम आते हैं। और एक अस्थायी और संदर्भ के संदर्भ में लौटने के बाद कि उस समारोह के बाद जहां उसका जीवनकाल बंधे रिटर्न अनिर्धारित व्यवहार है।

1

पहले दो में, आप अस्थायी के संदर्भ को वापस कर रहे हैं।

क्यों? खैर, आपका फ़ंक्शन T1 टाइप कर रहा है, लेकिन आपको भेजे गए प्रकारों में से एक को कनवर्ट करना होगा। रूपांतरण सही प्रकार का अस्थायी बनाता है। फिर आप इसे वापस कर रहे हैं।

अस्थायी मरने के बाद, लौटा संदर्भ मृत वस्तु से जुड़ा हुआ है।

आपको पहले से ही एक फिक्स मिल गया है। आप या तो संदर्भ वापस नहीं कर रहे हैं, या आप या तो एक ही प्रकार के पैरामीटर लेते हैं।

यदि आप मानक कार्यान्वयन को देखते हैं, तो उसने दूसरा समाधान चुना: उसी प्रकार के पैरामीटर लेना।

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