अस्वीकरण: यह प्रश्न समझने के लिए है। मैं क्षेत्र में boost::lexical_cast
का उपयोग करूंगा। It has sort of come up in the real world in places, though.क्या यह एक अस्थायी के लिए बाध्यकारी संदर्भ-से-गैर-कॉन्स का उदाहरण है?
एक "इनलाइन" लेक्स के कलाकारों दृष्टिकोण पर the following attempt लें:
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << "hi" << 0
).str();
std::cout << s;
}
परिणाम 0x804947c0
की तरह कुछ है, क्योंकि operator<<
कि "hi"
साथ काम करता है एक नि: शुल्क समारोह जिसका एलएचएस लेना चाहिए std::ostream&
और डैगर;, और अस्थायी std::ostringstream()
एक ref-to-non-const
से बाध्य नहीं हो सकता है। एकमात्र शेष मैच operator<<
है जो आरएचएस और डैगर पर const void*
लेता है; और डैगर;।
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << 0 << "hi"
).str();
std::cout << s;
}
परिणाम "0hi"
है।
यह ज्यादातर, समझ में आता है क्योंकि operator<<
कि int
लेता आधार ostream
और चाकू के एक सदस्य समारोह है, और चाकू, और कटार; और, इस तरह, अस्थायी पर बुलाए जाने के साथ ठीक है। उस ऑपरेशन का परिणाम ostream
आधार का संदर्भ है, जिसके लिए अगले operator<<
जंजीर है, यानी इसे (std::ostringstream() << 0) << "hi"
के रूप में पढ़ें।
लेकिन फिर क्यों"hi"
पर ऑपरेशन अपेक्षित परिणाम प्राप्त करने के लिए आगे बढ़ता है? क्या एलएचएस पर अभी भी एक अस्थायी संदर्भ नहीं है? सी ++ 03 पर
आइए फोकस; मुझे बताया गया है कि पहला उदाहरण वास्तविक रूप से कैल-ऑल ऑपरेटर के कारण सी ++ 11 में "इच्छित" के रूप में काम कर सकता है।
और डैगर;[C++03: 27.6.2.1]: template<class charT, class traits> basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,charT*);
और कटार; & कटार;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(const void* p);
और कटार; & कटार; & कटार;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(int n);
मुझे लगता है कि उत्तर "सीमाओं को बाध्यकारी करने के नियमों को संदर्भित करने के नियमों के समान कुछ नहीं है; यहां पर प्रासंगिक वाक्यांश हैं"। –
यह उसी कारण से काम करता है कि आप अस्थायी रूप से गैर-कॉन्स लैव्यू संदर्भों को बाध्य करने के लिए एक फ़ंक्शन टेम्पलेट 'टेम्पलेट टी & lvalue (T && v) {return v;}' लिख सकते हैं। –
Mankarse
क्या आपके पहले फुटनोट के लिए अधिभार नहीं होगा जो 'कॉन्स्ट चार [टी] * 'लेते हैं? (यह नहीं कि यह कुछ भी बदलता है।) – Mat