อันดับแรกเราจะนำ UDT ที่เป็นนามธรรมที่ไม่เหมาะสม (ประเภทที่กำหนดโดยผู้ใช้):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
เรายังจำได้ว่าเราสามารถยกตัวอย่าง UDT ในเวลาเดียวกันกับที่เรากำหนด:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
ลองรวบรวมตัวอย่างและจำไว้ว่าเราสามารถกำหนด UDT ที่ไม่มีชื่อ :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
เราไม่ต้องการการพิสูจน์เกี่ยวกับ UDT ที่ไม่ระบุตัวตนอีกต่อไปดังนั้นเราจึงสามารถสูญเสียฟังก์ชันเสมือนที่บริสุทธิ์ได้ นอกจากนี้ยังเปลี่ยนชื่อการinstance
ที่จะfoo
เราจะเหลือ:
struct {} foo;
การเข้าใกล้
ทีนี้จะเกิดอะไรขึ้นถ้า UDT นิรนามนี้มาจากบางฐาน?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
ในที่สุด C ++ 11 แนะนำผู้เริ่มต้นเพิ่มเติมเช่นเราสามารถทำสิ่งที่สับสนเช่นนี้:
int x{0};
และนี่:
int x{};
และในที่สุดนี้:
struct : bar {} foo {};
นี่คือโครงสร้างที่ไม่มีชื่อที่ได้มาจากแถบยกตัวอย่างเช่น foo ด้วย initializer ว่างเปล่า