Il FDIS ha una sezione per le incompatibilità, nell'appendice C.2"C ++ e ISO C ++ 2003".
Riepilogo, parafrasando qui il FDIS, per renderlo (migliore) adatto come risposta SO. Ho aggiunto alcuni miei esempi per illustrare le differenze.
Ci sono alcune incompatibilità legate alle biblioteche in cui non conosco esattamente le implicazioni di, quindi lascio a quelle che gli altri possono approfondire.
Linguaggio di base
#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 .
Nuove parole chiave: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert e thread_local
Alcuni letterali interi più grandi di quelli che possono essere rappresentati da long potrebbero passare da un tipo intero senza segno a long long.
Il codice C ++ 2003 valido che utilizza la divisione intera arrotonda il risultato verso 0 o verso l'infinito negativo, mentre C ++ 0x arrotonda sempre il risultato verso 0.
(certamente non è un problema di compatibilità per la maggior parte delle persone).
Il codice C ++ 2003 valido che utilizza la parola chiave autocome identificatore della classe di archiviazione potrebbe non essere valido in C ++ 0x.
Le conversioni restrittive causano incompatibilità con C ++ 03. Ad esempio, il seguente codice è valido in C ++ 2003 ma non valido in questo standard internazionale perché double in int è una conversione restrittiva:
int x[] = { 2.0 };
Le funzioni membro speciali dichiarate implicitamente sono definite come cancellate quando la definizione implicita sarebbe stata male formata.
Un programma C ++ 2003 valido che utilizza una di queste funzioni membro speciali in un contesto in cui la definizione non è richiesta (ad es. In un'espressione che non è potenzialmente valutata) diventa mal formato.
Esempio da parte mia:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Alcuni trucchi sono stati usati da alcuni SFINAE e ora devono essere cambiati :)
I distruttori dichiarati dall'utente hanno una specifica di eccezione implicita.
Esempio da parte mia:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Questo codice chiama terminatein C ++ 0x, ma non in C ++ 03. Perché la specifica dell'eccezione implicita di A::~Ain C ++ 0x è noexcept(true).
Una dichiarazione C ++ 2003 valida contenente non exportè formata in C ++ 0x.
Un'espressione C ++ 2003 valida contenente >immediatamente seguita da un'altra >può ora essere trattata come chiusura di due modelli.
In C ++ 03, >>sarebbe sempre il token dell'operatore shift.
Consenti chiamate dipendenti di funzioni con collegamento interno.
Esempio da parte mia:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
In C ++ 03, questo chiama f(long), ma in C ++ 0x, questo chiama f(int). Va notato che in C ++ 03 e C ++ 0x, le seguenti chiamate f(B)(il contesto di istanza considera ancora solo dichiarazioni di collegamento esterne).
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); }
La corrispondenza migliore f(A)non viene presa, perché non ha un collegamento esterno.
Modifiche alla libreria
Il codice C ++ 2003 valido che utilizza qualsiasi identificatore aggiunto alla libreria standard C ++ di C ++ 0x potrebbe non riuscire a compilare o produrre risultati diversi in questo standard internazionale.
Il codice C ++ 2003 valido che #includesindica le intestazioni con i nomi delle nuove intestazioni della libreria standard C ++ 0x potrebbe non essere valido in questo standard internazionale.
<algorithm>Potrebbe essere necessario includere il codice C ++ 2003 valido che è stato compilato in attesa di swap<utility>
Lo spazio dei nomi globale posixè ora riservato alla standardizzazione.
Valido codice C ++ 2003 che definisce override, final, carries_dependency, o noreturncome macro non sono validi in C ++ 0x.
exportparola chiave? Mi prenderò il cappotto.