FDIS memiliki bagian untuk ketidakcocokan, pada lampiran C.2
"C ++ dan ISO C ++ 2003".
Ringkasan, memparafrasekan FDIS di sini, untuk membuatnya (lebih baik) cocok sebagai jawaban SO. Saya menambahkan beberapa contoh saya sendiri untuk menggambarkan perbedaan.
Ada beberapa ketidakcocokan yang berhubungan dengan perpustakaan di mana saya tidak tahu persis implikasinya, jadi saya meninggalkannya untuk diuraikan oleh orang lain.
Bahasa inti
#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 .
Kata kunci baru: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert, dan thread_local
Literer integer tertentu yang lebih besar dari yang dapat diwakili oleh long dapat berubah dari tipe integer yang tidak ditandatangani menjadi lama yang ditandatangani.
Kode C ++ 2003 yang valid yang menggunakan pembulatan bilangan bulat bulat hasilnya ke 0 atau ke arah infinity negatif, sedangkan C ++ 0x selalu membulatkan hasilnya ke 0.
(diakui bukan masalah kompatibilitas bagi kebanyakan orang).
Kode C ++ 2003 yang valid yang menggunakan kata kunci auto
sebagai specifier kelas penyimpanan mungkin tidak valid dalam C ++ 0x.
Konversi yang sempit menyebabkan ketidakcocokan dengan C ++ 03. Misalnya, kode berikut ini valid dalam C ++ 2003 tetapi tidak valid dalam Standar Internasional ini karena double to int adalah konversi yang menyempit:
int x[] = { 2.0 };
Fungsi anggota khusus yang dideklarasikan secara implisit didefinisikan sebagai dihapus ketika definisi implisit akan telah dibentuk dengan buruk.
Program C ++ 2003 yang valid yang menggunakan salah satu fungsi anggota khusus ini dalam konteks di mana definisi tidak diperlukan (misalnya, dalam ekspresi yang tidak berpotensi dievaluasi) menjadi salah bentuk.
Contoh oleh saya:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Trik sizeof seperti itu telah digunakan oleh beberapa SFINAE, dan perlu diubah sekarang :)
Destroyer yang dideklarasikan pengguna memiliki spesifikasi pengecualian implisit.
Contoh oleh saya:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Kode ini memanggil terminate
C ++ 0x, tetapi tidak di C ++ 03. Karena spesifikasi pengecualian implisit A::~A
dalam C ++ 0x adalah noexcept(true)
.
Deklarasi C ++ 2003 yang valid yang berisi export
salah bentuk dalam C ++ 0x.
Ekspresi C ++ 2003 yang valid berisi >
diikuti segera oleh yang lain >
sekarang dapat dianggap sebagai penutupan dua templat.
Dalam C ++ 03, >>
akan selalu menjadi token operator-shift.
Izinkan panggilan fungsi yang bergantung dengan tautan internal.
Contoh oleh saya:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
Di C ++ 03, ini panggilan f(long)
, tetapi di C ++ 0x, ini panggilan f(int)
. Perlu dicatat bahwa di C ++ 03 dan C ++ 0x, panggilan berikut f(B)
(konteks instantiasi masih hanya mempertimbangkan deklarasi linkage eksternal).
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); }
Pencocokan yang lebih baik f(A)
tidak diambil, karena tidak memiliki tautan eksternal.
Perubahan perpustakaan
Kode C ++ 2003 yang valid yang menggunakan pengidentifikasi apa pun yang ditambahkan ke pustaka standar C ++ dari C ++ 0x mungkin gagal untuk mengkompilasi atau menghasilkan hasil yang berbeda dalam Standar Internasional ini.
Kode C ++ 2003 yang valid yang #includes
tajuk dengan nama header pustaka standar C ++ 0x yang baru mungkin tidak valid dalam Standar Internasional ini.
Kode C ++ 2003 yang valid yang telah dikompilasi mengharapkan swap menjadi <algorithm>
mungkin harus dimasukkan<utility>
Ruang nama global posix
sekarang dicadangkan untuk standardisasi.
Hari C ++ 2003 kode yang mendefinisikan override
, final
, carries_dependency
, atau noreturn
sebagai macro tidak valid di C ++ 0x.
export
kata kunci? Saya akan memberi saya mantel.