void foo (const std::string &s) {}
int main() {
foo(0); //compiles, but invariably causes runtime error
return 0;
}
संकलक (छ ++ 4.4) जाहिरा तौर पर 0
char* NULL
के रूप में व्याख्या, और string::string(const char*, const Allocator &a = Allocator())
फोन करके s
निर्माण करती है। जो निश्चित रूप से बेकार है, क्योंकि NULL
सूचक एक सी-स्ट्रिंग के लिए मान्य सूचक नहीं है। जब मैं foo(1)
पर कॉल करने का प्रयास करता हूं, तो यह गलत व्याख्या तब उत्पन्न नहीं होती है, यह मददगार रूप से संकलन-समय त्रुटि उत्पन्न करती है।मैं `0` से निर्मित std :: स्ट्रिंग से उत्पन्न होने वाली परेशानी को कैसे रोकूं?
वहाँ संकलन समय पर इस तरह के कोई त्रुटि या चेतावनी प्राप्त करने के लिए जब मैं गलती से bar(0)
साथ की तरह
void bar(const std::string &s, int i=1);
एक समारोह फोन, string
के बारे में भूल जाते हैं, और वास्तव में i=0
के लिए जिसका अर्थ है किसी भी संभावना है?
पर कोई त्रुटि उत्पन्न नहीं करेगा वास्तव में संकलक से कुछ मदद के बिना नहीं। कुछ कार्यान्वयनों ने इस मामले को पकड़ने के लिए एक निजी 'मूल_स्ट्रिंग (int)' जोड़ा है। यदि नहीं, तो मुझे लगता है कि आप भाग्य से बाहर हैं। –
मुझे आश्चर्य है कि यह पास जीसीसी है, यह बदसूरत त्रुटियों/चेतावनियों के लिए जाना जाता है, लेकिन मुझे यहां कुछ उम्मीद थी। क्या आपने चेतावनी स्तर को क्रैंक किया था? –
@Maththieu मुझे कोई विकल्प नहीं मिला जो मुझे चेतावनी देता है, लेकिन मैं वास्तव में जीसीसी चेतावनी विकल्पों में नहीं हूं। '-W -Wall -Wpointer-arith -Wcast-qual' किसी भी दर पर चाल नहीं करता है। – leftaroundabout