इस टेम्पलेट के साथ कोई संबंध नहीं है, आप एक ही परिणाम प्राप्त यदि T
सिर्फ std::string&
बजाय एक निष्कर्ष निकाला टेम्पलेट पैरामीटर के लिए एक typedef है:
:
#include <string>
typedef std::string& T;
T Foo(int & i)
{
return T(i);
}
int main()
{
int a = 1;
std::string & s = Foo(a);
}
डिटमार का जवाब मुझे इस साकार करने के लिए आगे सरल किया जा सकता बना दिया 210
#include <string>
typedef std::string& T;
int main()
{
int a = 1;
std::string & s = T(a);
}
जहां T(a)
डाली (T)a
यानी (std::string&)a
जो (5.4 [expr.cast] के नियमों के अनुसार) एक const_cast
करना होगा कि अगर मान्य है (जो यह नहीं है) के रूप में ही है या एक static_cast
यह है कि अगर मान्य है (जो यह नहीं है) या एक static_cast
एक const_cast
द्वारा पीछा किया है कि यदि मान्य है (जो यह नहीं है) या एक reinterpret_cast
कि यदि मान्य है (जो यह है) या एक reinterpret_cast
एक const_cast
कि यदि मान्य है, जिसके बाद, अन्यथा अभिव्यक्ति खराब है।
तो जैसा कि डिटमार ने कहा, यह एक reinterpret_cast
कर के रूप में ही है, यानी
std::string & s = reinterpret_cast<std::string&>(a);
मुझे लगता है यह काफी आश्चर्य की बात है कि मूल कोड को संकलित करता है, लेकिन के रूप में यह ऊपर है कि रेखा के रूप में ही है, यह संकलन करने की अनुमति दी है । कास्ट के परिणाम का उपयोग करना अनिश्चित व्यवहार हालांकि है।
आश्चर्य से बचने जहां T(a)
एक डाली के बराबर है, नई सी ++ 11 वर्दी प्रारंभ वाक्य रचना, T{a}
है, जो हमेशा एक प्रारंभ, नहीं एक डाली अभिव्यक्ति है का उपयोग करें।
महान प्रश्न, जांच और जवाब देने से मुझे एक नया गोचा दिखाया गया था, मुझे पहले ज्ञान के नए हिस्से के लिए जेरेडसी और डाइटमार के बारे में पता नहीं था!
स्रोत
2012-12-17 00:58:32
यदि आप 'Foo(a);' का आह्वान कर रहे हैं और विशेषज्ञता 'Foo () 'को निकालने की उम्मीद कर रहे हैं तो आपकी विशेषज्ञता को बहुत चौंकाने वाला नहीं कहा जाता है। –
WhozCraig
@WozCraig मैं सहमत हूं, मैं निराश था क्योंकि यह समझ में नहीं आया था। – JaredC
यह निश्चित रूप से आग है, अगर आप सीधे 'Foo()' का आह्वान करते हैं, लेकिन वास्तव में यह वास्तव में नहीं है कि आप आखिरकार क्या खोज रहे हैं, इसमें कोई संदेह नहीं है। –
WhozCraig