2014-09-13 7 views
6

Inspired by my observation in a previous question, मैं एक छोटे से परीक्षण करना का फैसला किया:क्लैंग मुझे सी ++ 03 मोड में गैर-कॉन्स्ट संदर्भ द्वारा अस्थायी क्यों लेता है?

#include <iostream> 
#include <sstream> 

int main() 
{ 
    char c = 'A'; 
    std::stringstream ss("B"); 

    // I know this is bad mojo; that's why I'm testing it 
    ss >> char(c); 

    std::cout << c << std::endl; 
} 

मेरे संकलक संस्करण: सी ++ 03 मोड में

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

संकलन बजना , यह संकलित करता है और ठीक चलाता है:

$ clang++ -Wall -pedantic -std=c++03 test.cpp 
test.cpp:9:6: warning: expression result unused [-Wunused-value] 
    ss >> char(c); 
    ~~^~~~~~~~ 
1 warning generated. 
$ ./a.out 
A 

यह A प्रिंट करता है, जो ठीक है, यह देखते हुए कि यह कोड संकलित भी नहीं होना चाहिए। C++ 11 मोड पर स्विचिंग, संकलन करते समय यह ठीक से त्रुटियां (error: invalid operands to binary expression ('std::stringstream' (aka 'basic_stringstream<char>') and 'int'))।

हां, सी ++ 03 मोड में यह चेतावनी देता है, लेकिन यह एक चेतावनी नहीं है जिसे मैं उम्मीद करता हूं (मुझे उम्मीद है कि किसी प्रकार का "संदर्भ द्वारा अस्थायी लेना" चेतावनी/त्रुटि, या शायद एक चेतावनी/त्रुटि कह रही है नहीं operator>>char पैरामीटर स्वीकार करता है)।

मेरा प्रश्न है: कोड सफलतापूर्वक C++ 03 मोड में क्यों संकलित करता है? क्या यह operator>> के कुछ वैकल्पिक अधिभार का उपयोग कर रहा है जो संदर्भ द्वारा अस्थायी लेने से बचाता है? क्या यह अत्यधिक ढीला हो रहा है और मुझे अस्थायी रूप से संदर्भ दे रहा है? मैं परेशान हूं कि क्लैंग इस कोड को क्यों स्वीकार करता है; GCC 4.9 अधिक सटीक त्रुटि (error: no match for 'operator>>' (operand types are 'std::stringstream {aka std::basic_stringstream<char>}' and 'char')) के साथ C++ 03/11 मोड में ठीक से त्रुटियां उत्पन्न होती हैं। सी ++ 03 मोड में क्लैंग का व्यवहार मुझे परेशान कर रहा है।

+2

मेरा संस्करण ('क्लैंग संस्करण 3.5.0 (टैग/RELEASE_350/अंतिम), लक्ष्य: x86_64-अज्ञात-लिनक्स-gnu, थ्रेड मॉडल: posix') ठीक से त्रुटियां, इसलिए यह संभव है कि यह एक बग है तय किया गया है –

+0

मुझे उम्मीद है कि 5.1 3.5.0 से बाद में होगा। तो अगर कुछ भी, यह पेश किया गया है, तय नहीं है। – celtschk

+1

@celtschk 5.1 ऐप्पल का संस्करण संख्या है। यह 3.4svn से आधारित है, इसलिए 3.5 नया है। – sepp2k

उत्तर

2

मैं इसे std::stringstream की operator bool() invokes, वह है, कोड

bool(ss) >> char(c); 

जो निश्चित रूप से कोई प्रभाव नहीं के साथ एक मान्य बयान के रूप में स्वीकार किया जाता है लगता है। bool लिए अंतर्निहित रूपांतरण रिटर्न !fail() और क्या कोड मानक एक और प्रकार है कि bool बजाय सादे bool में धर्मान्तरित कन्वर्ट करने के लिए अनुमति देता है

while (ss >> foo) 
    ... 

की तरह (उदाहरण के लिए एक void*) वास्तव में इस प्रकार की समस्या से बचने के लिए अनुमति देता है। स्पष्ट रूप से आपका कार्यान्वयन उस स्वतंत्रता का उपयोग नहीं करता है।

+0

आह, यह समझ में आएगा, खासकर जब से 'ऑपरेटर बूल() 'सी ++ 11 में' स्पष्ट 'होने के लिए बदल दिया गया था। – Cornstalks

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