क्यों निम्नलिखित कोड मान्य है:एक सही अग्रेषण समारोह क्यों टेम्पलेट किया जाना चाहिए?
template<typename T1>
void foo(T1 &&arg) { bar(std::forward<T1>(arg)); }
std::string str = "Hello World";
foo(str); // Valid even though str is an lvalue
foo(std::string("Hello World")); // Valid because literal is rvalue
लेकिन नहीं:
void foo(std::string &&arg) { bar(std::forward<std::string>(arg)); }
std::string str = "Hello World";
foo(str); // Invalid, str is not convertible to an rvalue
foo(std::string("Hello World")); // Valid
क्यों उदाहरण 2 में lvalue एक ही तरीके है कि यह उदाहरण 1 में करता है में हल नहीं करता है?
इसके अलावा, मानक को यह समझने में महत्वपूर्ण क्यों लगता है कि तर्क प्रकार को आगे बढ़ाना आसान बनाम std :: आगे बना रहा है? बस कॉल करने के बावजूद, आगे कॉल करना इरादा दिखा रहा है।
यदि यह मानक चीज़ नहीं है और केवल मेरा कंपाइलर है, तो मैं msvc10 का उपयोग कर रहा हूं, जो क्रैपी सी ++ 11 समर्थन की व्याख्या करेगा।
धन्यवाद
संपादित करें 1: बदल दिया शाब्दिक "नमस्ते दुनिया" एसटीडी जा करने के लिए :: स्ट्रिंग ("हैलो दुनिया") एक rvalue बनाने के लिए।
बार में क्या होता है? संकलन का मतलब यह नहीं है कि यह जरूरी काम कर रहा है। मेरा मानना है कि यह क्रमशः 'शून्य फू (टी 1 और तर्क) 'और' शून्य फू (std :: स्ट्रिंग और तर्क) होना चाहिए। – AJG85
'" हैलो वर्ल्ड "' एक रैल्यू नहीं है, यह 'const char [12]' प्रकार के साथ एक अंतराल है। – GManNickG
@ AJG85 बार में क्या होता है महत्वपूर्ण नहीं है। && का मतलब है rvalue संदर्भ। – Mranz