FDIS มีส่วนสำหรับความเข้ากันไม่ได้ที่ภาคผนวกC.2
"C ++ และ ISO C ++ 2003"
สรุปถอดความ FDIS ที่นี่เพื่อให้เหมาะสมกับคำตอบ SO (ดีกว่า) ฉันเพิ่มตัวอย่างของฉันเองเพื่อแสดงความแตกต่าง
มีความเข้ากันไม่ได้ที่เกี่ยวข้องกับห้องสมุดอยู่สองสามอย่างที่ฉันไม่รู้ความหมายของสิ่งนั้นดังนั้นฉันจึงปล่อยให้คนอื่น ๆ ทำอย่างละเอียด
ภาษาหลัก
#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 .
คำหลักใหม่: alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert และ thread_local
ตัวอักษรจำนวนเต็มบางตัวที่ใหญ่กว่าความยาวที่สามารถแทนด้วยความยาวอาจเปลี่ยนจากประเภทจำนวนเต็มที่ไม่ได้ลงชื่อไปเป็นแบบยาวที่ลงนามแล้ว
รหัส C ++ 2003 ที่ถูกต้องที่ใช้การหารจำนวนเต็มปัดผลลัพธ์เป็น 0 หรือไปทางอนันต์ลบในขณะที่ C ++ 0x จะปัดผลลัพธ์เป็น 0 เสมอ
(จริงๆแล้วไม่ใช่ปัญหาความเข้ากันได้สำหรับคนส่วนใหญ่)
รหัส C ++ 2003 ที่ถูกต้องที่ใช้คำหลักauto
เป็นตัวระบุคลาสหน่วยเก็บข้อมูลอาจไม่ถูกต้องใน C ++ 0x
การแปลงที่แคบทำให้เกิดความไม่เข้ากันกับ C ++ 03 ตัวอย่างเช่นรหัสต่อไปนี้ถูกต้องใน C ++ 2003 แต่ไม่ถูกต้องในมาตรฐานสากลนี้เนื่องจาก double to int เป็นการแปลงที่แคบลง:
int x[] = { 2.0 };
ฟังก์ชันสมาชิกพิเศษที่ประกาศโดยนัยจะถูกลบโดยไม่ได้ตั้งใจเมื่อคำนิยามโดยนัยจะมีรูปแบบไม่ดี
โปรแกรม C ++ 2003 ที่ถูกต้องซึ่งใช้หนึ่งในฟังก์ชันพิเศษของสมาชิกเหล่านี้ในบริบทที่ไม่จำเป็นต้องใช้คำจำกัดความ (เช่นใน expresion ที่ไม่อาจประเมินได้) กลายเป็นรูปแบบที่ไม่ถูกต้อง
ตัวอย่างจากฉัน:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
เทคนิค SFINAE ขนาดดังกล่าวถูกใช้ไปแล้วและต้องการเปลี่ยนตอนนี้ :)
destructors ที่ผู้ใช้ประกาศมีข้อกำหนดข้อยกเว้นโดยนัย
ตัวอย่างจากฉัน:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
รหัสนี้เรียกใช้terminate
ใน C ++ 0x แต่ไม่ได้อยู่ใน C ++ 03 เนื่องจากข้อกำหนดข้อยกเว้นโดยนัยของA::~A
ใน C ++ 0x noexcept(true)
เป็น
การประกาศ C ++ 2003 ที่ถูกต้องมีexport
อยู่ในรูปแบบไม่ถูกต้องใน C ++ 0x
นิพจน์ C ++ 2003 ที่ถูกต้องซึ่งมี>
ตามมาทันที>
จะถูกถือว่าเป็นเทมเพลตสองรายการ
ใน C ++ 03 >>
จะเป็นโทเค็นของตัวดำเนินการ shift เสมอ
อนุญาตการเรียกใช้ฟังก์ชันที่ขึ้นอยู่กับการเชื่อมโยงภายใน
ตัวอย่างจากฉัน:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
ใน C ++ 03 การโทรนี้f(long)
แต่ใน C ++ 0x การโทรf(int)
นี้ ควรสังเกตว่าในทั้ง C ++ 03 และ C ++ 0x การเรียกต่อไปนี้f(B)
(บริบทการสร้างอินสแตนซ์ยังคงพิจารณาเฉพาะการประกาศการเชื่อมโยงภายนอกเท่านั้น)
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); }
การจับคู่ที่ดีกว่าf(A)
นั้นไม่ได้เกิดขึ้นเนื่องจากไม่มีการเชื่อมโยงภายนอก
การเปลี่ยนแปลงห้องสมุด
รหัส C ++ 2003 ที่ถูกต้องที่ใช้ตัวระบุใด ๆ ที่เพิ่มในไลบรารีมาตรฐาน C ++ ของ C ++ 0x อาจไม่สามารถรวบรวมหรือสร้างผลลัพธ์ที่แตกต่างในมาตรฐานสากลนี้
รหัส C ++ 2003 ที่ถูกต้องที่#includes
ส่วนหัวพร้อมชื่อใหม่ส่วนหัวของไลบรารีมาตรฐาน C ++ 0x อาจไม่ถูกต้องในมาตรฐานสากลนี้
รหัส C ++ 2003 ที่ถูกต้องซึ่งได้รับการเรียบเรียงโดยคาดหวังว่าการแลกเปลี่ยนจะต้อง<algorithm>
มี<utility>
posix
ขณะนี้namespace ส่วนกลางถูกสงวนไว้สำหรับการสร้างมาตรฐาน
ที่ถูกต้อง C ++ 2003 รหัสที่กำหนดoverride
, final
, carries_dependency
หรือnoreturn
เป็นแมโครไม่ถูกต้องใน C ++ 0x
export
คำหลักออกไหม ฉันจะรับเสื้อโค้ท