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 auto
come 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 terminate
in C ++ 0x, ma non in C ++ 03. Perché la specifica dell'eccezione implicita di A::~A
in 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 #includes
indica 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 noreturn
come macro non sono validi in C ++ 0x.
export
parola chiave? Mi prenderò il cappotto.