Le FDIS a une section pour les incompatibilités, à l'annexe C.2
"C++ et ISO C++ 2003".
Résumé, en paraphrasant le FDIS ici, pour le faire (mieux) approprié comme une SORTE de réponse. J'ai ajouté quelques exemples de mon propre à illustrer les différences.
Il y a un peu de la bibliothèque liés à des incompatibilités où je ne sais pas exactement les implications de l', je laisse donc ceux pour les autres à 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 .
Mots-clés: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert, et thread_local
Certains les littéraux entiers plus grands que ce qui peut être représenté par temps pouvez modifier à partir d'un type entier non signé signé de longue de longue.
Valide en C++ 2003 code qui utilise la division entière arrondit le résultat vers 0 ou vers l'infini négatif, alors que C++0x toujours arrondit le résultat vers 0.
(certes, pas vraiment un problème de compatibilité pour la plupart des gens).
Valide en C++ 2003 code qui utilise le mot-clé auto
comme une classe de stockage spécificateur peut être invalide en C++0x.
Rétrécissement des conversions provoquer des incompatibilités avec C++03. Par exemple, le code suivant est valide en C++ 2003, mais non valides dans la présente Norme Internationale parce que le double, int est un rétrécissement de conversion:
int x[] = { 2.0 };
Implicitement déclarées spécial des fonctions membres sont définis comme étant supprimés lors de la définition implicite aurait été mal formé.
Valide en C++ 2003 programme qui utilise l'une de ces fonctions de membre dans un contexte où la définition n'est pas nécessaire (par exemple, dans une expression qui n'est pas potentiellement évalué) devient mal formé.
Par exemple moi:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Ces sizeof astuces ont été utilisés par certains SFINAE, et doit être changé maintenant :)
L'utilisateur déclaré destructeurs ont une exception implicite de la spécification.
Par exemple moi:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Ce code appelle terminate
dans C++0x, mais ne pas en C++03. Parce que l'exception implicite spécification d' A::~A
dans C++0x est - noexcept(true)
.
Valide en C++ 2003 déclaration contenant export
est mal formé dans C++0x.
Valide en C++ 2003 expression contenant >
, suivi immédiatement par un autre >
peuvent maintenant être traitées comme la fermeture de deux modèles.
En C++03, >>
serait toujours la maj opérateur jeton.
Permettre dépendante des appels de fonctions avec une liaison interne.
Par exemple 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 nécessite, f(long)
, mais en C++0x, cela nécessite, f(int)
. Il convient de noter que dans les deux C++03 et C++0x, à la suite d'appels f(B)
(l'instanciation contexte encore ne considère que extern lien déclarations).
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); }
Meilleure correspondance f(A)
n'est pas prise, parce qu'il n'a pas de liaison externe.
Modifications de bibliothèque
Valide en C++ 2003 code qui utilise tous les identificateurs ajouté à la norme C++
bibliothèque de C++0x peut ne pas compiler ou de produire des résultats différents dans la Présente Norme Internationale.
Valide en C++ 2003 code #includes
- têtes avec de nouveaux noms de C++0x bibliothèque standard en-têtes peuvent être non valide dans la présente Norme Internationale.
Valide en C++ 2003 code qui a été compilé en attendant échange sera en <algorithm>
peut-être à la place comprennent <utility>
L'espace de noms global posix
est désormais réservé à la normalisation.
Valide en C++ 2003 code qui définit override
, final
, carries_dependency
ou noreturn
sous forme de macros n'est pas valide en C++0x.