Le FDIS a une section pour les incompatibilités, en annexe C.2
"C ++ et ISO C ++ 2003".
Résumé, paraphrasant le FDIS ici, pour le rendre (mieux) approprié comme réponse SO. J'ai ajouté quelques exemples pour illustrer les différences.
Il y a quelques incompatibilités liées à la bibliothèque dont je ne connais pas exactement les implications, donc je laisse celles-ci aux autres pour les développer.
Langage de 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 .
Nouveaux mots clés: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert et thread_local
Certains littéraux entiers plus grands que ce qui peut être représenté par long pourraient passer d'un type entier non signé à signé long long.
Un code C ++ 2003 valide qui utilise une division entière arrondit le résultat vers 0 ou vers l'infini négatif, tandis que C ++ 0x arrondit toujours le résultat vers 0.
(certes pas vraiment un problème de compatibilité pour la plupart des gens).
Le code C ++ 2003 valide qui utilise le mot-clé auto
comme spécificateur de classe de stockage peut être invalide en C ++ 0x.
Le rétrécissement des conversions provoque des incompatibilités avec C ++ 03. Par exemple, le code suivant est valide en C ++ 2003 mais non valide dans la présente Norme internationale, car le double en int est une conversion restrictive:
int x[] = { 2.0 };
Les fonctions membres spéciales déclarées implicitement sont définies comme supprimées lorsque la définition implicite aurait été mal formée.
Un programme C ++ 2003 valide qui utilise l'une de ces fonctions membres spéciales dans un contexte où la définition n'est pas requise (par exemple, dans une expression qui n'est pas potentiellement évaluée) devient mal formé.
Exemple par moi:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
De telles astuces de sizeof ont été utilisées par certains SFINAE, et doivent être modifiées maintenant :)
Les destructeurs déclarés par l'utilisateur ont une spécification d'exception implicite.
Exemple par moi:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Ce code appelle terminate
en C ++ 0x, mais pas en C ++ 03. Parce que la spécification d'exception implicite de A::~A
C ++ 0x est noexcept(true)
.
Une déclaration C ++ 2003 valide contenant export
est mal formée en C ++ 0x.
Une expression C ++ 2003 valide contenant >
immédiatement suivie par une autre >
peut maintenant être traitée comme fermant deux modèles.
En C ++ 03, >>
serait toujours le jeton de l'opérateur de décalage.
Autoriser les appels de fonctions dépendants avec liaison interne.
Exemple par moi:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
En C ++ 03, cela appelle f(long)
, mais en C ++ 0x, cela appelle f(int)
. Il convient de noter que dans C ++ 03 et C ++ 0x, les appels suivants f(B)
(le contexte d'instanciation ne considère toujours que les déclarations de liaison externe).
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 meilleure correspondance f(A)
n'est pas prise, car elle n'a pas de liaison externe.
Modifications de la bibliothèque
Le code C ++ 2003 valide qui utilise tous les identificateurs ajoutés à la bibliothèque standard C ++ de C ++ 0x peut ne pas compiler ou produire des résultats différents dans la présente Norme internationale.
Un code C ++ 2003 valide indiquant que les #includes
en - têtes avec les noms des nouveaux en-têtes de bibliothèque standard C ++ 0x peuvent être invalides dans la présente Norme internationale.
Le code C ++ 2003 valide qui a été compilé en s'attendant à ce que le swap soit <algorithm>
inclus doit inclure à la place<utility>
L'espace de noms global posix
est désormais réservé à la normalisation.
Valide C ++ code 2003 qui définit override
, final
, carries_dependency
ou noreturn
sous forme de macros est invalide dans C ++ 0x.
export
mot-clé? Je vais me chercher un manteau.