2016-06-07 6 views
5

हाल के एक प्रोजेक्ट पर, मैंने एक त्रुटि में भाग लिया जहां मैंने गलती से एक स्ट्रिंग संदर्भ में फ्लोट असाइन किया (फ्लोट को स्ट्रिंग में बदलने के बजाय, फिर इसे असाइन करना)।एक स्ट्रिंग संदर्भ कार्यों के लिए एक फ्लोट असाइन करना-क्यों?

कोड कुछ इस तरह (दोनों 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 नहीं कर रहा हूँ चेतावनी के रूप में बहुत कुछ नहीं देते हैं। (मेरा सबसे अच्छा अनुमान यह है कि कंपाइलर ने फ्लोट, इंट, मेमोरी एड्रेस से जाने के लिए कुछ प्रकार के निहित पुन: परिभाषित किया है ...?)

क्या कोई चेतावनी है जिसे मैं सक्षम कर सकता हूं (एक्सकोड में, आदर्श रूप में) भविष्य में इस तरह की चीज को रोक देगा?

उत्तर

8

इस सदस्य समारोह की वजह से है:

string& operator=(char ch); 

चल बिन्दु से अंतर्निहित रूपांतरण सी में प्रकार पूर्णांक ++ नहीं है (char एक पूर्णांक प्रकार है)।

आम तौर पर आप इस रूपांतरण के बारे में चेतावनी प्राप्त करने के लिए g ++ में -Wfloat-conversion का उपयोग कर सकते हैं, लेकिन मैंने कोशिश की और यह चेतावनी नहीं दी। अप्रत्याशित चल/पूर्णांक रूपांतरण के लिए त्रुटियों प्राप्त करने के लिए कोड को संशोधित करने के लिए एक आसान तरीका (? हो सकता है कि बग संकलक)

है:

s = { 1.0f }; 

एक अन्य विकल्प बनाने के लिए समारोह वापसी प्रकार के रूप में string है (आम तौर पर बोल रहा है इस डिजाइन वैसे भी एक "बाहर" संदर्भ पैरामीटर वाले) को पसंद किया जाता है:

static string get_text() { return 1.0f; } 

दुर्भाग्य से यह कई छोटे std::string का उपयोग, जो "डिजाइन" किया गया था जब सी ++ अभी भी बहुत यूँ था आसपास के नुकसान में से एक है जी और यह स्पष्ट नहीं था कि अवांछनीय दीर्घकालिक परिणाम क्या होंगे।

+0

आकर्षक। वंशावली के लिए, मैं इसे जोड़ दूंगा, जबकि 'std :: string' में' ऑपरेटर = (char c) 'है, वही निर्माता नहीं है जो एक वर्ण लेता है --- जो बताता है कि मेरा क्यों प्रश्न में 'get_text()' का दूसरा संस्करण संकलित नहीं होगा। यदि मैं पढ़ने के लिए उस दूसरे संस्करण को संशोधित करता हूं: 'स्ट्रिंग आउट; बाहर = (चार) 1.0 एफ; ', यह संकलित करता है। – s3cur3

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