FDIS में असंगतियों के लिए एक खंड है, परिशिष्ट C.2
"C ++ और ISO C ++ 2003" पर।
सारांश, एफडीआईएस को यहां प्रस्तुत करना, इसे (बेहतर) एसओ उत्तर के रूप में उपयुक्त बनाने के लिए। मतभेदों को स्पष्ट करने के लिए मैंने अपने स्वयं के कुछ उदाहरण जोड़े।
कुछ पुस्तकालय-संबंधी असंगतताएँ हैं जहाँ मुझे इसके निहितार्थों के बारे में ठीक-ठीक पता नहीं है, इसलिए मैं दूसरों के बारे में विस्तार से बताना चाहता हूँ।
मूल भाषा
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
नए कीवर्ड: एलायंस, एलायडॉफ़, char16_t, char32_t, कॉन्स्ट्रेप, डेक्स्टाइप, नोएक्ससेप्ट, नल्ट्रप्र, static_assert, और thread_local
लंबे समय तक प्रतिनिधित्व किए जाने वाले कुछ पूर्णांक शाब्दिक को एक अहस्ताक्षरित पूर्णांक प्रकार से बदलकर लंबे समय तक हस्ताक्षरित किया जा सकता है।
Valid C ++ 2003 कोड जो पूर्णांक विभाजन का उपयोग करता है, परिणाम 0 की ओर या नकारात्मक अनंत की ओर ले जाता है, जबकि C ++ 0x हमेशा परिणाम को 0 की ओर गोल करता है।
(वास्तव में ज्यादातर लोगों के लिए एक अनुकूलता समस्या नहीं है)।
मान्य C ++ 2003 कोड जो कीवर्ड auto
को स्टोरेज क्लास स्पेसियर के रूप में उपयोग करता है वह C ++ 0x में अमान्य हो सकता है।
संकीर्ण रूपांतरण C ++ 03 के साथ असंगतता का कारण बनते हैं। उदाहरण के लिए, निम्न कोड C ++ 2003 में मान्य है, लेकिन इस अंतर्राष्ट्रीय मानक में अमान्य है क्योंकि int से दोगुना एक संकीर्ण रूपांतरण है:
int x[] = { 2.0 };
अवैध रूप से घोषित विशेष सदस्य कार्य डी as एनड के रूप में हटाए जाते हैं, जब अंतर्निहित परिभाषा बीमार हो गई होती।
एक मान्य C ++ 2003 प्रोग्राम जो इन विशेष सदस्य कार्यों में से एक का उपयोग उस संदर्भ में करता है जहाँ परिभाषा की आवश्यकता नहीं होती है (उदाहरण के लिए, एक एक्सर्साइज़ में जिसका संभावित मूल्यांकन नहीं किया जाता है) बीमार हो जाता है।
मेरे द्वारा उदाहरण:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
इस तरह के आकार के ट्रिक्स का इस्तेमाल कुछ SFINAE द्वारा किया गया है, और अब इसे बदलने की आवश्यकता है :)
उपयोगकर्ता-घोषित विध्वंसक का एक अंतर्निहित अपवाद विनिर्देश है।
मेरे द्वारा उदाहरण:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
यह कोड terminate
C ++ 0x में कॉल करता है, लेकिन C ++ 03 में नहीं है। क्योंकि A::~A
C ++ 0x में निहित अपवाद विनिर्देश है noexcept(true)
।
export
C ++ 0x में एक मान्य C ++ 2003 घोषणा निरूपित है।
एक मान्य C ++ 2003 अभिव्यक्ति जिसमें >
तुरंत दूसरे का पालन किया जाता है >
उसे अब दो टेम्प्लेट को बंद करने के रूप में माना जा सकता है।
C ++ 03 में, >>
हमेशा शिफ्ट-ऑपरेटर टोकन होगा।
आंतरिक लिंकेज के साथ कार्यों के आश्रित कॉल की अनुमति दें।
मेरे द्वारा उदाहरण:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
C ++ 03 में, यह कॉल करता है f(long)
, लेकिन C ++ 0x में, यह कॉल करता है f(int)
। यह ध्यान दिया जाना चाहिए कि C ++ 03 और C ++ 0x दोनों में, निम्न कॉल f(B)
(इंस्टेंटेशन संदर्भ अभी भी केवल बाहरी लिंकेज घोषणाओं पर विचार करता है)।
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
बेहतर मिलान f(A)
नहीं लिया जाता है, क्योंकि इसमें बाहरी संबंध नहीं है।
पुस्तकालय बदलता है
मान्य C ++ 2003 कोड जो C ++ 0x के C ++ मानक पुस्तकालय में जोड़े गए किसी भी पहचानकर्ता का उपयोग करता है, इस अंतर्राष्ट्रीय मानक में विभिन्न परिणामों को संकलित करने या उत्पादन करने में विफल हो सकता है।
मान्य C ++ 2003 कोड जो #includes
नए C ++ 0x मानक लाइब्रेरी हेडर के नाम के साथ हेडर इस अंतर्राष्ट्रीय मानक में अमान्य हो सकता है।
मान्य C ++ 2003 कोड जिसे स्वैप करने की अपेक्षा संकलित किया गया <algorithm>
है, इसके बजाय इसमें शामिल होना पड़ सकता है<utility>
वैश्विक नाम स्थान posix
अब मानकीकरण के लिए आरक्षित है।
मान्य सी ++ 2003 कोड है कि परिभाषित करता है override
, final
, carries_dependency
, या noreturn
मैक्रो के रूप में C ++ 0x में अमान्य है।
export
कीवर्ड का अर्थ निकाल रहा है ? मुझे कोट मिल जाएगा।