Das FDIS enthält einen Abschnitt für Inkompatibilitäten im Anhang C.2
"C ++ und ISO C ++ 2003".
Zusammenfassung, um das FDIS hier zu paraphrasieren, damit es (besser) als SO-Antwort geeignet ist. Ich habe einige eigene Beispiele hinzugefügt, um die Unterschiede zu veranschaulichen.
Es gibt einige bibliotheksbezogene Inkompatibilitäten, bei denen ich die Auswirkungen nicht genau kenne. Daher überlasse ich diese anderen, um sie zu erläutern.
Kernsprache
#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 .
Neue Schlüsselwörter: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert und thread_local
Bestimmte ganzzahlige Literale, die größer sind als durch long dargestellt werden können, können sich von einem vorzeichenlosen Integer-Typ zu einem vorzeichenbehafteten long long ändern.
Gültiger C ++ 2003-Code, der eine ganzzahlige Division verwendet, rundet das Ergebnis gegen 0 oder gegen negative Unendlichkeit, während C ++ 0x das Ergebnis immer gegen 0 rundet.
(Zugegebenermaßen kein wirkliches Kompatibilitätsproblem für die meisten Menschen).
Gültiger C ++ 2003-Code, der das Schlüsselwort auto
als Speicherklassenspezifizierer verwendet, ist in C ++ 0x möglicherweise ungültig.
Eingeschränkte Konvertierungen führen zu Inkompatibilitäten mit C ++ 03. Der folgende Code ist beispielsweise in C ++ 2003 gültig, in diesem internationalen Standard jedoch ungültig, da double to int eine engere Konvertierung darstellt:
int x[] = { 2.0 };
Implizit deklarierte spezielle Elementfunktionen werden als gelöscht definiert, wenn die implizite Definition fehlerhaft gewesen wäre.
Ein gültiges C ++ 2003-Programm, das eine dieser speziellen Elementfunktionen in einem Kontext verwendet, in dem die Definition nicht erforderlich ist (z. B. in einem Ausdruck, der möglicherweise nicht ausgewertet wird), wird fehlerhaft.
Beispiel von mir:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Solche Größen von Tricks wurden von einigen SFINAE verwendet und müssen jetzt geändert werden :)
Vom Benutzer deklarierte Destruktoren haben eine implizite Ausnahmespezifikation.
Beispiel von mir:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Dieser Code ruft terminate
in C ++ 0x auf, jedoch nicht in C ++ 03. Weil die implizite Ausnahmespezifikation von A::~A
in C ++ 0x ist noexcept(true)
.
Eine gültige C ++ 2003-Deklaration, die enthält, export
ist in C ++ 0x fehlerhaft.
Ein gültiger C ++ 2003-Ausdruck, >
der unmittelbar gefolgt von einem anderen Ausdruck enthält, >
kann jetzt als Schließen von zwei Vorlagen behandelt werden.
In C ++ 03 >>
wäre immer das Shift-Operator-Token.
Ermöglichen Sie abhängige Aufrufe von Funktionen mit interner Verknüpfung.
Beispiel von mir:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
In C ++ 03 wird dies aufgerufen f(long)
, in C ++ 0x jedoch f(int)
. Es ist zu beachten, dass sowohl in C ++ 03 als auch in C ++ 0x die folgenden Aufrufe ausgeführt werden f(B)
(der Instanziierungskontext berücksichtigt immer noch nur externe Verknüpfungsdeklarationen).
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); }
Die bessere Übereinstimmung f(A)
wird nicht genommen, da es keine externe Verknüpfung gibt.
Bibliotheksänderungen
Gültiger C ++ 2003-Code, der Bezeichner verwendet, die der C ++ - Standardbibliothek von C ++ 0x hinzugefügt wurden, kann möglicherweise nicht kompiliert werden oder zu unterschiedlichen Ergebnissen in diesem internationalen Standard führen.
Gültiger C ++ 2003-Code, der #includes
Header mit Namen neuer C ++ 0x-Standardbibliotheksheader enthält, ist in diesem internationalen Standard möglicherweise ungültig.
Gültiger C ++ 2003-Code, der kompiliert wurde und erwartet, dass Swap vorhanden ist, muss <algorithm>
möglicherweise stattdessen enthalten sein<utility>
Der globale Namespace posix
ist jetzt für die Standardisierung reserviert.
Gültig C ++ 2003 - Code, der definiert , override
, final
, carries_dependency
, oder noreturn
als Makros in C ++ 0x ungültig ist.
export
Schlüsselworts entfernen ? Ich hole mir Mantel.