C ++ 11 में कौन से ब्रेकिंग परिवर्तन पेश किए गए हैं?


227

मुझे पता है कि C ++ 11 में कम से कम एक परिवर्तन जो संकलन को रोकने के लिए कुछ पुराने कोड का कारण बनेगा: explicit operator bool()मानक पुस्तकालय का परिचय , पुराने उदाहरणों की जगह operator void*()। दी, कोड जो इसे तोड़ देगा, शायद वह कोड है जो पहली जगह में मान्य नहीं होना चाहिए था, लेकिन यह अभी भी एक ब्रेकिंग परिवर्तन है फिर भी: ऐसे प्रोग्राम जो पहले मान्य नहीं होते थे।

क्या कोई अन्य परिवर्तन हैं?


1
exportकीवर्ड का अर्थ निकाल रहा है ? मुझे कोट मिल जाएगा।
स्टीव जेसोप

7
आप जानते हैं, मैं इसे रूपांतरण-टू-बूल के "ब्रेकिंग परिवर्तन" ... को "दंडात्मक परिवर्तन" की तरह नहीं कहूंगा।
Xeo

4
जब इस तरह के संघ बनाने के लिए सभी कागजी कार्रवाई सिर्फ रबर की मुहर लगने की प्रतीक्षा कर रही है, तो निश्चित रूप से, क्यों नहीं?
डेनिस जिकफोज जू

3
@ Xeo: के mystream.good()रूप में ही नहीं है bool(mystream)? good()अगर कोई झंडा नहीं लगाया गया है तो सच है। bool(mystream)केवल eofbitसेट है, तो अभी भी गलत है। !mystream.fail()सही समकक्ष होगा।
आर। मार्टिनो फर्नांडिस

2
मॉडरेटर ध्यान दें : " कृपया प्रश्न या उत्तर के साथ विषय पर टिप्पणी रखें। किसी प्रश्न या उत्तर पर चर्चा करते समय, चर्चा सिर्फ इस बारे में होनी चाहिए कि प्रश्न या उत्तर हाथ में है। सामान्य रूप से, स्टैक ओवरफ्लो के लिए रचनात्मक नहीं है। निश्चित रूप से नाराज नहीं है। "
टिम पोस्ट

जवाबों:


178

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(...) { } }

यह कोड terminateC ++ 0x में कॉल करता है, लेकिन C ++ 03 में नहीं है। क्योंकि A::~AC ++ 0x में निहित अपवाद विनिर्देश है noexcept(true)


exportC ++ 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 में अमान्य है।


"आंतरिक लिंकेज के साथ कार्यों के आश्रित कॉल की अनुमति दें।" क्या आप अपने दो उदाहरणों के बीच के अंतर पर विस्तृत जानकारी दे सकते हैं? मुझे स्पष्ट रूप से कुछ याद आ रहा है।
डेनिस ज़िकफोज़

@ इस परिवर्तन को open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#561 द्वारा शुरू किया गया था । यद्यपि वे इस तथ्य पर टिप्पणी नहीं करते हैं, लेकिन "इंस्ट्रूमेंटेशन संदर्भ" में अभी भी "केवल एक ही अनुवाद इकाई में टेम्पलेट विशेषज्ञता के तात्कालिकता के बिंदु से पहले घोषित बाहरी लिंकेज के साथ घोषणाओं का सेट" शामिल है। इसलिए उनके द्वारा किया गया परिवर्तन केवल परिभाषा के संदर्भ में खोज को प्रभावित करता है।
जोहान्स शाउब -

दिए गए मेरे पहले उदाहरण में, आंतरिक-लिंकेज फ़ंक्शन टेम्पलेट की परिभाषा के संदर्भ में दिखाई और पाया गया था। मेरे दूसरे उदाहरण में, आंतरिक लिंकेज फ़ंक्शन को खोजने के लिए तात्कालिक संदर्भ का हिस्सा होना चाहिए। लेकिन जब से यह नहीं है, यह नहीं पाया जा सकता है।
जोहान्स शाउब -

संयोग से, मुझे लगता है कि एकमात्र मामला है जहां आंतरिक संबंध के साथ एक फ़ंक्शन खोजने के लिए टेम्पलेट परिभाषा संदर्भ के लिए यह सुरक्षित है जब फ़ंक्शन टेम्पलेट विशेषज्ञता केवल एक टीयू (जहां टेम्पलेट को परिभाषित किया गया है) में स्पष्ट रूप से त्वरित रूप से त्वरित है, और सभी टीयू पर भरोसा करते हैं यह स्पष्ट तात्कालिकता है। अन्य सभी मामलों में (जहां अन्य TU विशिष्टीकरण को स्वयं समाप्त कर देते हैं), आप हर बार एक अलग (आंतरिक लिंकेज) फ़ंक्शन का उपयोग करके टेम्पलेट की परिभाषा से ODR का उल्लंघन करेंगे।
जोहान्स शाउब -

इसलिए मुझे यकीन नहीं है कि उन्होंने तात्कालिकता के संदर्भ पर प्रतिबंध क्यों रखा - केवल एक (स्पष्ट) तात्कालिकता होगी, और वह तात्कालिकता तात्कालिक टीयू के तात्कालिक संदर्भ में पाए जाने वाले आंतरिक संबंध कार्यों का उपयोग करेगी। जैसे यह परिभाषा के संदर्भ के लिए होगा। संयोग से, मुझे लगता है कि अगर हमारे पास अभी भी होता है export, तो मुझे लगता है कि अन्य टीयू को स्पष्ट तात्कालिकता पर भरोसा करने की आवश्यकता नहीं होगी, लेकिन टेम्पलेट थीम को तुरंत बदल सकते हैं। तब यह फर्क पड़ेगा कि तात्कालिक संदर्भ में आंतरिक लिंकेज फ़ंक्शन दिखाई देते हैं या नहीं।
जोहान्स स्काउब -

28

ऑटो कीवर्ड का अर्थ बदल गया।


9
यदि आप autoकीवर्ड का उपयोग कर रहे हैं , तो आपके कोड में कुछ गड़बड़ है। पृथ्वी पर आप इसका उपयोग क्यों करेंगे?
एलाजार लीबोविच

यह एक परिवर्तन नहीं है । autoC ++ 11 में प्रत्येक वैध C ++ 03 का उपयोग मान्य रहता है।
आकर्षित डोरमैन

11
@DrewDormann int main() { auto int i = 0; return i; }पूरी तरह से वैध है C ++ 03, लेकिन C ++ 11 में एक सिंटैक्स त्रुटि। केवल चेतावनी जो मुझे C ++ 03 मोड में इसके लिए देने के लिए कंपाइलर मिल सकती है, वह संगतता के बारे में एक चेतावनी है।

24

ब्रेकिंग चेंज?

खैर, एक बात के लिए, यदि आप का इस्तेमाल किया decltype, constexpr, nullptr, आदि पहचानकर्ता के रूप में तो आप मुसीबत में हो सकता है ...


21

कुछ मुख्य असंगतताएं जो असंगतताओं के खंड द्वारा कवर नहीं की जाती हैं:


C ++ 0x इंजेक्शन वर्ग के नाम को एक टेम्पलेट के रूप में मानता है, यदि नाम को टेम्पलेट टेम्पलेट पैरामीटर के तर्क के रूप में पारित किया जाता है, और एक प्रकार के रूप में यदि इसे टेम्पलेट प्रकार के पैरामीटर में पास किया जाता है।

मान्य C ++ 03 कोड अलग तरीके से व्यवहार कर सकता है यदि यह इन इंजेक्टेड क्लास नाम पर निर्भर करता है ताकि इन परिदृश्यों में हमेशा एक प्रकार हो। उदाहरण का कोड मेरे क्लैंग पीआर से लिया गया है

template<template<typename> class X>
struct M { };

template<template<typename> class X>
void g(int = 0); // #1

template<typename T>
void g(long = 0); // #2

template<typename T>
struct A {
  void f() {
    g<A>(); /* is ambiguous in C++0x */
    g<A>(1); /* should choose #1 in C++0x */
  }
};

void h() {
  A<int> a;
  a.f();
}

C ++ 03 में, कोड दूसरी gबार दोनों कॉल करता है ।


C ++ 0x कुछ नाम बनाता है जो C ++ 03 में निर्भर थे जो अब गैर-निर्भर हैं। और गैर-निर्भर योग्य नामों के लिए नाम खोज की आवश्यकता होती है, जो तात्कालिकता में दोहराए जाने वाले वर्तमान वर्ग टेम्पलेट के सदस्यों को संदर्भित करते हैं, और सत्यापन की आवश्यकता होती है कि ये नाम उसी तरह से खोजते हैं जैसे कि टेम्पलेट परिभाषा संदर्भ में किया गया है।

मान्य C ++ 03 कोड जो प्रभुत्व नियम पर निर्भर करता है, अब इस परिवर्तन के कारण अब संकलित नहीं हो सकता है।

उदाहरण:

struct B { void f(); };

template<typename T>
struct A : virtual B { void f(); };

template<typename T>
struct C : virtual B, A<T> {
  void g() { this->f(); }
};

int main() { C<int> c; c.g(); }

यह मान्य C ++ 03 कोड जो कॉल A<int>::fC ++ 0x में मान्य नहीं है, क्योंकि जब इंस्टेंटिंग का A<int>::fविरोध किया जाएगा तो नाम लुकअप B::fपर-परिभाषा लुकअप के साथ विरोध पैदा होगा।

इस बिंदु पर, यह स्पष्ट नहीं है कि यह एफडीआईएस में दोष है या नहीं। समिति इससे अवगत है और स्थिति का मूल्यांकन करेगी।


एक का उपयोग करते हुए घोषणा, जहां अंतिम भाग क्वालिफायर के अंतिम भाग में पहचानकर्ता के रूप में समान है, एक आधार वर्ग को दर्शाते हुए, कि घोषणा का उपयोग करते हुए अब उस नाम वाले सदस्यों के बजाय, कंस्ट्रक्टर का नाम दिया जाता है।

उदाहरण:

struct A { protected: int B; };
typedef A B;

struct C : B {
  // inheriting constructor, instead of bringing A::B into scope
  using B::B;
};

int main() { C c; c.B = 0; }

उपरोक्त उदाहरण कोड C ++ 03 में अच्छी तरह से बनाया गया है, लेकिन C ++ 0x में बीमार है, जैसा A::Bकि अभी भी अंदर से दुर्गम है main


14

स्ट्रीम निष्कर्षण विफलता का इलाज अलग तरीके से किया जाता है।

उदाहरण

#include <sstream>
#include <cassert>

int main()
{
   std::stringstream ss;
   ss << '!';
   
   int x = -1;
   
   assert(!(ss >> x)); // C++03 and C++11
   assert(x == -1);    // C++03
   assert(x == 0);     // C++11
}

प्रस्ताव बदलें

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3246.html#23

मानक संदर्भ

[C++03: 22.2.2.1.2/11]: चरण 2 प्रसंस्करण का परिणाम इनमें से एक हो सकता है

  • चरण 2 का एक क्रम चरण 2 में संचित किया गया है जो कि scanfप्रकार के मान में परिवर्तित किया गया है (नियमों के अनुसार ) val। यह मान संग्रहीत है valऔर इसमें ios_base::goodbitसंग्रहीत है err
  • चरण 2 में जमा हुए वर्णों के अनुक्रम ने scanfइनपुट विफलता की रिपोर्ट की है। ios_base::failbitको सौंपा गया है err[ed: कुछ भी संग्रहीत नहीं है val]

[C++11: 22.4.2.1.2/3]: [..] संग्रहीत किया जाने वाला संख्यात्मक मान इनमें से एक हो सकता है:

  • शून्य, यदि रूपांतरण फ़ंक्शन पूरे क्षेत्र को परिवर्तित करने में विफल रहता हैios_base::failbitको सौंपा गया है err
  • यदि क्षेत्र में प्रतिनिधित्व करने के लिए बहुत बड़ा सकारात्मक मूल्य का प्रतिनिधित्व करता है, तो सबसे सकारात्मक प्रतिनिधित्व योग्य मूल्य valios_base::failbitको सौंपा गया है err
  • यदि किसी फ़ील्ड का प्रतिनिधित्व करने के लिए बहुत बड़ा ऋणात्मक मान का प्रतिनिधित्व करता है, तो एक अहस्ताक्षरित पूर्णांक प्रकार के लिए सबसे नकारात्मक प्रतिनिधित्व योग्य मूल्य या शून्य valios_base::failbitको सौंपा गया है err
  • परिवर्तित मूल्य, अन्यथा।

परिणामी संख्यात्मक मान में संग्रहीत किया जाता है val

क्रियान्वयन

  • C ++ 11 के लिए GCC 4.8 सही ढंग से आउटपुट :

    दावा `एक्स == -1 'विफल

  • GCC 4.5-4.8 C ++ 03 के लिए सभी आउटपुट निम्नलिखित हैं, जो एक बग प्रतीत होगा:

    दावा `एक्स == -1 'विफल

  • दृश्य C ++ 2008 एक्सप्रेस C ++ 03 के लिए सही आउटपुट देता है:

    दावा विफल: x == 0

  • विजुअल C ++ 2012 एक्सप्रेस गलत तरीके से C ++ 11 के लिए आउटपुट करता है, जो कि एक स्थिति-क्रियान्वयन समस्या प्रतीत होगी:

    दावा विफल: x == 0


13

कैसे स्पष्ट रूपांतरण ऑपरेटरों की शुरूआत एक परिवर्तन है? पुराना संस्करण अभी भी पहले की तरह "मान्य" होगा।

हाँ, से परिवर्तन operator void*() constकरने के लिए explicit operator bool() constएक को तोड़ने में बदलाव किया जाएगा, लेकिन केवल अगर यह एक तरीका है कि आप में और अपने से बाहर गलत है में प्रयोग किया जाता है। अनुरूपता कोड नहीं तोड़ा जाएगा।

अब, एक और ब्रेकिंग परिवर्तन कुल आरंभ के दौरान रूपांतरण को सीमित करने पर प्रतिबंध है :

int a[] = { 1.0 }; // error

संपादित करें : बस याद, std::identity<T>C ++ 0x में हटा दिया जाएगा (नोट देखें)। यह प्रकारों को निर्भर बनाने के लिए एक सुविधा संरचना है। चूंकि संरचना वास्तव में बहुत कुछ नहीं करती है, इसलिए इसे ठीक करना चाहिए:

template<class T>
struct identity{
  typedef T type;
};

यदि मानक लाइब्रेरी ऑब्जेक्ट में स्पष्ट रूपांतरण जोड़े गए हैं, तो मौजूदा निहित रूपांतरण काम करना बंद कर सकते हैं। लेकिन मैं ऐसे परिदृश्य की कल्पना नहीं कर सकता जहाँ रूपांतरण मान्य नहीं होगा और कुछ उपयोगी होगा।
डेनिस जिकफोज जू

परिचय एक ब्रेकिंग परिवर्तन है क्योंकि यह मौजूदा की जगह लेने वाला है operator void*
आर। मार्टिनो फर्नांडिस

@ डेनिस: आआह, मैं अब देख रहा हूं कि @ मर्तिन्हो का क्या मतलब था। लेकिन यह केवल एक ब्रेकिंग परिवर्तन होगा यदि लोग इसे अन्य उद्देश्य से उपयोग करते हैं।
Xeo

"लेकिन केवल अगर इसे एक ऐसे तरीके से उपयोग किया जाता है जो अपने आप में और बाहर गलत है" - bool ok = cin >> a; cout << "done reading" << endl; if (ok) { ... }सी ++ 03 में इसके साथ वास्तव में कुछ भी गलत नहीं है, फिर भी यह सी ++ 11 में एक त्रुटि बन गई है। (नोट: GCC 4.9 अभी भी operator void*() constयहाँ है, यही कारण है कि यह C ++ 11 मोड में कोड को स्वीकार करता है।)

std::identity<T>C ++ 11 में हटाया नहीं गया था, क्योंकि यह C ++ 03 का हिस्सा नहीं था। यह C ++ 11 के मसौदे में संक्षिप्त रूप से मौजूद था, और इसे मानकीकरण से पहले मसौदे से हटा दिया गया था।
हावर्ड हिनांट

8

कंटेनरों की लाइब्रेरी में कई बदलाव हुए हैं जो अधिक कुशल कोड की अनुमति देते हैं लेकिन चुपचाप कुछ कोने के मामलों के लिए पीछे की संगतता को तोड़ते हैं।

उदाहरण के लिए, std::vectorडिफ़ॉल्ट निर्माण, C ++ 0x और ब्रेकिंग परिवर्तन पर विचार करें


7

वहाँ पिछड़े संगतता को तोड़ने के निहितार्थ कदम की बहुत चर्चा हुई है

( प्रासंगिक चर्चा वाला एक पुराना पृष्ठ )

यदि आप टिप्पणियों में पढ़ते हैं, तो निहित चाल वापसी भी एक ब्रेकिंग परिवर्तन है।


उन चर्चाओं का परिणाम यह है कि लगभग सभी मामलों में इसे हटा दिया गया। क्या कोई समस्या है जो बचे हैं?
डेनिस जिकफोज जू


आह, मोबाइल पेज पर टिप्पणी नहीं दिखाई गई। किसी भी तरह से, यह बहुत अधिक उपयोगी लिंक है ... मानकीकरण प्रक्रिया की ऐतिहासिक विषमताएं प्रासंगिक नहीं हैं (जब तक कि आप एमएसवीसी का उपयोग नहीं कर रहे हैं, जो मुझे लगता है कि पहले मसौदे का उपयोग करता है)।
डेनिस जिकफोज जू

@ डेनिस: मुझे लगता है कि आप सही हैं। मेरे उत्तर में कुछ के आसपास लिंक ले गए।
बेन वोइगट

अफसोस की बात है, cpp-next.com अब मौजूद नहीं है। भविष्य के संदर्भ के लिए ये web.archive.org द्वारा सहेजे गए पृष्ठ हैं: अव्यवस्थित रूप से पीछे की ओर बढ़ती संगतता और प्रासंगिक चर्चा वाला एक पुराना पृष्ठ
मैक्स Truxa

6
struct x {
   x(int) {}
};

void f(auto x = 3) { }

int main() {
   f();
}

C ++ 03: मान्य।

C ++ 0x: error: parameter declared 'auto'


2
@ Xeo: कोड C ++ 03 में मान्य है। यह प्रकार struct xऔर कोई नाम नहीं के साथ एक पैरामीटर है ।
बेन वोइगट

मैं किसी को पकड़ने की उम्मीद कर रहा था। मैं केवल यह चाहता हूं कि @Xeo को अपनी टिप्पणी को हटाने की इतनी जल्दी नहीं थी, क्योंकि मुझे यह पढ़ने को नहीं मिला!
ऑर्बिट

@ Xeo: व्याकरण के माध्यम से खुदाई किए बिना, मुझे यकीन है कि ऑटो सिर्फ एक वैध कीवर्ड नहीं है। यदि ऐसा होता, तो यह संभवतः आपकी अपेक्षा के अनुरूप काम करता, लेकिन यह ठीक से परिभाषित करने के लिए शायद वास्तविक कठिन है।
डेनिस जिकफोज जू

मान लीजिए कि आपने मुझे पकड़ा है। इसने शाब्दिक रूप से संरचना की उपेक्षा की। :)
Xeo

@Tomalek: Xeo ने ठीक ही कहा था कि C ++ 03 का निहितार्थ नहीं है।
बेन वायगट

-4

भाषा सुविधाएं

  1. {} का उपयोग करके समान और सामान्य आरंभ
  2. ऑटो
  3. संकीर्णता की रोकथाम
  4. constexpr
  5. लूप के लिए आधारित रेंज
  6. nullptr
  7. एनम वर्ग
  8. static_assert
  9. std :: initializer_list
  10. अवतरण संदर्भ (गति शब्दार्थ)
  11. >>
  12. lambdas
  13. वैरेडिक टेम्प्लेट
  14. प्रकार और टेम्पलेट उपनाम
  15. यूनिकोड वर्ण
  16. लंबे लंबे पूर्णांक प्रकार
  17. संरेखित करें और संरेखित करें
  18. decltype
  19. कच्चे स्ट्रिंग शाब्दिक
  20. सामान्यीकृत POD
  21. सामान्यीकृत यूनियनें
  22. टेम्पलेट तर्क के रूप में स्थानीय कक्षाएं
  23. प्रत्यय वापसी प्रकार सिंटैक्स
  24. [[carries_d dependency]] और [[noeturn]]
  25. noexcept स्पेसर
  26. noexcept ऑपरेटर।
  27. C99 विशेषताएं:
    • विस्तारित अभिन्न प्रकार
    • संकीर्ण / विस्तृत स्ट्रिंग का संयोजन
    • _ _ STDC_HOSTED _ _
    • _Pragma (एक्स)
    • वैरग मैक्रोज़ और खाली मैक्रो तर्क
  28. _ _ दुर्गंध _ _
  29. इनलाइन नामस्थान
  30. निर्माण करने वाले प्रतिनिधि
  31. इन-क्लास सदस्य शुरुआती
  32. डिफ़ॉल्ट और हटाएँ
  33. स्पष्ट रूपांतरण ऑपरेटर
  34. उपयोगकर्ता-परिभाषित शाब्दिक
  35. बाहरी टेम्पलेट
  36. फ़ंक्शन टेम्प्लेट के लिए डिफ़ॉल्ट टेम्पलेट तर्क
  37. निर्माण करने वाले
  38. ओवरराइड और फाइनल
  39. सरल और अधिक सामान्य SFINAE नियम
  40. मेमोरी मॉडल
  41. thread_local

मानक-पुस्तकालय घटक

  1. कंटेनरों के लिए initializer_list
  2. कंटेनरों के लिए शब्दार्थ को स्थानांतरित करें
  3. forward_list
  4. हैश कंटेनर
    • unordered_map
    • unordered_multimap
    • unordered_set
    • unordered_multiset
  5. संसाधन प्रबंधन संकेत
    • unique_ptr
    • shared_ptr
    • weak_ptr
  6. संगति समर्थन
    • धागा
    • mutexes
    • ताले
    • हालत चर
  7. उच्च-स्तरीय संगामिति समर्थन
    • packaged_thread
    • भविष्य
    • वादा
    • async
  8. tuples
  9. regex
  10. रैंडम नंबर
    • uniform_int_distribution
    • सामान्य वितरण
    • random_engine
    • आदि।
  11. पूर्णांक प्रकार के नाम, जैसे int16_t, uint32_t, और int_fast64_t
  12. सरणी
  13. अपवादों को कॉपी और रीथ्रोइंग करना
  14. सिस्टम में गड़बड़ी
  15. कंटेनर के लिए emplace () संचालन
  16. बाधा कार्य
  17. Noexcept फ़ंक्शन का व्यवस्थित उपयोग
  18. समारोह और बाँध
  19. संख्यात्मक मान रूपांतरण के लिए स्ट्रिंग
  20. आबंटित आवंटनकर्ता
  21. प्रकार के लक्षण
  22. समय उपयोगिताओं: अवधि और time_point
  23. अनुपात
  24. quick_exit
  25. अधिक एल्गोरिदम, जैसे कि चाल (), copy_if (), और is_sorted ()
  26. कचरा संग्रहण ए.बी.आई.
  27. एटोमिक्स

पदावनत विशेषताएँ

  1. एक विध्वंसक के साथ एक वर्ग के लिए कॉपी कंस्ट्रक्टर और कॉपी असाइनमेंट की पीढ़ी।
  2. एक स्ट्रिंग शाब्दिक एक चार को असाइन करें *।
  3. सी ++ 98 अपवाद विनिर्देश
    • unexcepted_handler
    • set_unexpected
    • get_unexpected
    • अप्रत्याशित
  4. फ़ंक्शन और संबंधित फ़ंक्शन
  5. auto_ptr
  6. रजिस्टर करें
  7. ++ एक बूल पर
  8. निर्यात
  9. सी-स्टाइल की कास्ट

3
इस सवाल का जवाब नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.