Điều này có thể có nghĩa gì trong C ++ 11?
struct : bar {} foo {};
Điều này có thể có nghĩa gì trong C ++ 11?
struct : bar {} foo {};
Câu trả lời:
Trước tiên, chúng tôi sẽ lấy một UDT trừu tượng tiêu chuẩn không có thật (Loại do người dùng xác định):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Chúng ta cũng nhớ lại rằng chúng ta có thể khởi tạo UDT cùng lúc với việc chúng ta xác định nó:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Hãy kết hợp các ví dụ và nhớ lại rằng chúng ta có thể định nghĩa một UDT không có tên :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Chúng ta không cần bằng chứng về UDT ẩn danh nữa, vì vậy chúng ta có thể mất chức năng ảo thuần túy. Đồng thời đổi tên instance
thành foo
, chúng tôi còn lại với:
struct {} foo;
Đến gần.
Bây giờ, nếu UDT ẩn danh này xuất phát từ một số cơ sở thì sao?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Cuối cùng, C ++ 11 giới thiệu các trình khởi tạo mở rộng , để chúng ta có thể thực hiện những điều khó hiểu như thế này:
int x{0};
Và điều này:
int x{};
Và cuối cùng, cái này:
struct : bar {} foo {};
Đây là một cấu trúc không tên được lấy từ thanh, được khởi tạo là foo với một trình khởi tạo trống.