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 मोड में क्लैंग का व्यवहार मुझे परेशान कर रहा है।
मेरा संस्करण ('क्लैंग संस्करण 3.5.0 (टैग/RELEASE_350/अंतिम), लक्ष्य: x86_64-अज्ञात-लिनक्स-gnu, थ्रेड मॉडल: posix') ठीक से त्रुटियां, इसलिए यह संभव है कि यह एक बग है तय किया गया है –
मुझे उम्मीद है कि 5.1 3.5.0 से बाद में होगा। तो अगर कुछ भी, यह पेश किया गया है, तय नहीं है। – celtschk
@celtschk 5.1 ऐप्पल का संस्करण संख्या है। यह 3.4svn से आधारित है, इसलिए 3.5 नया है। – sepp2k