Cú pháp C ++ 11 điên rồ này là gì ==> struct: bar {} foo {};?


168

Điều này có thể có nghĩa gì trong C ++ 11?

struct : bar {} foo {};

Thật thú vị, bạn có thấy nó hữu ích cho một cái gì đó? Tôi đoán đó là một mẹo để tạo các trường hợp đơn được gõ mạnh (các loại được gắn thẻ).
alfC

@alfC: Không đặc biệt hữu ích, không
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời:


262

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 instancethà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.


11
Tôi biết rằng nên tránh những bình luận tiêu cực về một ngôn ngữ lập trình, và có lẽ nó hơi lạc đề ở đây. Nhưng tôi không hiểu tại sao C ++ 0x lại trở thành một ngôn ngữ thậm chí phức tạp hơn C ++. Ai muốn điều đó? Những lợi thế của một ngôn ngữ lập trình đang ngày càng trở nên khó hiểu là gì? Tuyên bố này là IMHO một ví dụ khác về điều này. Tôi đã sử dụng C ++ trong nhiều năm và tôi vẫn gặp khó khăn để thành thạo ngôn ngữ này.
Giorgio

26
@Giorgio: Tại sao điều này là một vấn đề? Chính xác thì điều gì làm bạn sợ? Cấu trúc được mô tả là một trường hợp bên lề được ngôn ngữ cho phép và tuân theo tự nhiên từ các khái niệm cốt lõi của nó, không có gì sai với nó. Đó cũng là tiện ích rất hạn chế. Bạn sẽ không bao giờ phải sử dụng nó. Tuy nhiên, về mặt cú pháp, nó không va chạm hay xung đột với bất cứ điều gì. Vì vậy, tại sao điều này sẽ là một đối số chống lại một ngôn ngữ, đặc biệt là một ngôn ngữ được thiết kế đặc biệt tốt?
Kerrek SB

13
@Giorgio - phần tuyệt vời là tình huống hoàn toàn ngược lại; c ++ 0x đang bổ sung rất nhiều cơ sở mạnh mẽ được chờ đợi mà không bị khó hiểu hoặc quá xấu xí; bạn muốn mật mã? - kiểm tra Perl. Ví dụ này ở đây gần như không tiếp cận tiêu đề của tiền điện tử.
Gene Bushuyev

18
@Kerrek SB Tôi nghĩ rằng C ++ (và bây giờ là C ++ 0x) đơn giản là có quá nhiều khái niệm khác nhau và việc học cú pháp và ngữ nghĩa là khó khăn. Mỗi lập trình viên (tôi là một trong số họ) kết thúc bằng cách sử dụng một tập hợp con của ngôn ngữ vì có quá nhiều cách khác nhau để làm cùng một việc. Tôi không nghĩ C ++ được thiết kế tốt. Có nhiều tính năng đặc biệt và một số điều cơ bản nhất định như cơ chế mô-đun (nhập / xuất) mạnh mẽ bị thiếu (vẫn sử dụng #incolee cũ từ C). Tôi nghĩ rằng nỗ lực C ++ 0x nên nhằm mục đích làm cho C ++ nhỏ hơn và dễ sử dụng hơn, không lớn hơn.
Giorgio

31
@Giorgio: Thành thật mà nói, bất kỳ nỗ lực nào như vậy sẽ phải nỗ lực xây dựng lại C ++ từ đầu, tức là tạo ra một ngôn ngữ mới . Và điều đó đã được thực hiện ... nhiều lần.
Các cuộc đua nhẹ nhàng trong quỹ đạo

106

Điều này định nghĩa:

  • một cấu trúc ẩn danh,
  • có nguồn gốc công khai từ bar
  • which ( anonymously) định nghĩa không có gì khác ngoài những gì nó bắt nguồn từbar
  • và cuối cùng, một thể hiện, được gọi là "foo" được tạo ra,
  • với một danh sách khởi tạo trống

struct : bar {} foo {};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.