FDIS có một phần không tương thích, tại phụ lục C.2
"C ++ và ISO C ++ 2003".
Tóm tắt, diễn giải FDIS ở đây, để làm cho nó (tốt hơn) phù hợp như một câu trả lời SO. Tôi đã thêm một số ví dụ của riêng tôi để minh họa sự khác biệt.
Có một vài sự không tương thích liên quan đến thư viện mà tôi không biết chính xác ý nghĩa của nó, vì vậy tôi để những thứ đó cho người khác giải thích.
Ngôn ngữ cốt lõi
#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 .
Các từ khóa mới: alignas, alignof, char16_t, char32_t, constexpr, dectype, noexcept, nullptr, static_assert và thread_local
Một số chữ nguyên nhất định lớn hơn có thể được biểu thị bằng dài có thể thay đổi từ loại số nguyên không dấu sang chữ ký dài.
Mã C ++ 2003 hợp lệ sử dụng phép chia số nguyên làm tròn kết quả về 0 hoặc hướng tới vô cực âm, trong khi C ++ 0x luôn làm tròn kết quả về 0.
(thừa nhận không thực sự là một vấn đề tương thích cho hầu hết mọi người).
Mã C ++ 2003 hợp lệ sử dụng từ khóa auto
làm công cụ xác định lớp lưu trữ có thể không hợp lệ trong C ++ 0x.
Chuyển đổi hẹp gây ra sự không tương thích với C ++ 03. Ví dụ: đoạn mã sau hợp lệ trong C ++ 2003 nhưng không hợp lệ trong Tiêu chuẩn quốc tế này vì double to int là một chuyển đổi thu hẹp:
int x[] = { 2.0 };
Các hàm thành viên đặc biệt được khai báo ngầm định được định nghĩa là đã bị xóa khi định nghĩa ngầm sẽ không được định dạng.
Một chương trình C ++ 2003 hợp lệ sử dụng một trong các hàm thành viên đặc biệt này trong bối cảnh không yêu cầu định nghĩa (ví dụ: trong một biểu hiện không có khả năng được đánh giá) trở nên không rõ ràng.
Ví dụ của tôi:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
Thủ thuật sizeof như vậy đã được một số SFINAE sử dụng và cần phải thay đổi ngay bây giờ :)
Các hàm hủy do người dùng khai báo có một đặc tả ngoại lệ ngầm định.
Ví dụ của tôi:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Mã này gọi terminate
trong C ++ 0x, nhưng không có trong C ++ 03. Bởi vì đặc tả ngoại lệ ngầm định A::~A
trong C ++ 0x là noexcept(true)
.
Một khai báo C ++ 2003 hợp lệ có chứa export
không đúng định dạng trong C ++ 0x.
Một biểu thức C ++ 2003 hợp lệ có chứa >
theo sau bởi một biểu thức khác >
hiện có thể được coi là đóng hai mẫu.
Trong C ++ 03, >>
sẽ luôn là mã thông báo toán tử thay đổi.
Cho phép các cuộc gọi phụ thuộc của các chức năng với liên kết nội bộ.
Ví dụ của tôi:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
Trong C ++ 03, cuộc gọi này f(long)
, nhưng trong C ++ 0x, cuộc gọi này f(int)
. Cần lưu ý rằng trong cả C ++ 03 và C ++ 0x, các cuộc gọi sau f(B)
(bối cảnh khởi tạo vẫn chỉ xem xét các khai báo liên kết ngoài).
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); }
Sự phù hợp tốt hơn f(A)
không được thực hiện, bởi vì nó không có liên kết bên ngoài.
Thay đổi thư viện
Mã C ++ 2003 hợp lệ sử dụng bất kỳ số nhận dạng nào được thêm vào thư viện chuẩn C ++ của C ++ 0x có thể không biên dịch hoặc tạo ra các kết quả khác nhau trong Tiêu chuẩn quốc tế này.
Mã C ++ 2003 hợp lệ mà #includes
các tiêu đề có tên của các tiêu đề thư viện chuẩn C ++ 0x mới có thể không hợp lệ trong Tiêu chuẩn quốc tế này.
Mã C ++ 2003 hợp lệ đã được biên dịch dự kiến trao đổi <algorithm>
có thể phải thay vào đó bao gồm<utility>
Không gian tên toàn cầu posix
hiện được dành riêng cho tiêu chuẩn hóa.
Hợp lệ C ++ 2003 mã mà định nghĩa override
, final
, carries_dependency
, hoặc noreturn
như macro là không hợp lệ trong C ++ 0x.
export
từ khóa? Tôi sẽ lấy cho tôi áo khoác.