हाल के एक प्रोजेक्ट पर, मैंने एक त्रुटि में भाग लिया जहां मैंने गलती से एक स्ट्रिंग संदर्भ में फ्लोट असाइन किया (फ्लोट को स्ट्रिंग में बदलने के बजाय, फिर इसे असाइन करना)।एक स्ट्रिंग संदर्भ कार्यों के लिए एक फ्लोट असाइन करना-क्यों?
कोड कुछ इस तरह (दोनों Xcode/एप्पल LLVM 7.1 और जीसीसी 4.9.2 के तहत परीक्षण किया) देखा:
#include <iostream>
using namespace std;
static void get_text(string &s) {
s = 1.0f; // Legal (not even a warning!)
}
// This version gives a compiler error (as I'd expect)
// static void get_text(string &s) {
// string out = 1.0f;
// s = out;
// }
int main() {
string s;
get_text(s);
cout << s << endl; // Prints garbage
return 0;
}
मुद्रण स्ट्रिंग स्पष्ट रूप से कचरा में परिणाम है, लेकिन मैं स्पष्ट कारण है कि इस didn नहीं कर रहा हूँ चेतावनी के रूप में बहुत कुछ नहीं देते हैं। (मेरा सबसे अच्छा अनुमान यह है कि कंपाइलर ने फ्लोट, इंट, मेमोरी एड्रेस से जाने के लिए कुछ प्रकार के निहित पुन: परिभाषित किया है ...?)
क्या कोई चेतावनी है जिसे मैं सक्षम कर सकता हूं (एक्सकोड में, आदर्श रूप में) भविष्य में इस तरह की चीज को रोक देगा?
आकर्षक। वंशावली के लिए, मैं इसे जोड़ दूंगा, जबकि 'std :: string' में' ऑपरेटर = (char c) 'है, वही निर्माता नहीं है जो एक वर्ण लेता है --- जो बताता है कि मेरा क्यों प्रश्न में 'get_text()' का दूसरा संस्करण संकलित नहीं होगा। यदि मैं पढ़ने के लिए उस दूसरे संस्करण को संशोधित करता हूं: 'स्ट्रिंग आउट; बाहर = (चार) 1.0 एफ; ', यह संकलित करता है। – s3cur3