Là một loại POD chính xác tương đương với một loại bố cục tiêu chuẩn, tầm thường?


22

Trong C ++ 20, khái niệm POD không được dùng nữa, được cho là bởi vì nó là một đặc điểm tổng hợp vô nghĩa của việc tầm thường và bố cục tiêu chuẩn. Tuy nhiên, định nghĩa về POD trong dự thảo C ++ 20 không chính xác là "cả tầm thường và bố cục tiêu chuẩn"; nó thực sự là:

Một lớp POD là một lớp vừa là lớp tầm thường vừa là lớp bố cục tiêu chuẩn và không có thành viên dữ liệu không tĩnh của loại lớp không POD (hoặc mảng của nó). Loại POD là loại vô hướng, lớp POD, mảng kiểu như vậy hoặc phiên bản đủ điều kiện cv của một trong các loại này.

Nói cách khác, không chỉ là một loại POD cả tầm thường và bố cục tiêu chuẩn, mà nó còn được đệ quy như vậy.

Đây có phải là yêu cầu đệ quy không? Nói cách khác, nếu một kiểu vừa tầm thường vừa là bố cục tiêu chuẩn, liệu nó có tự động đệ quy theo sơ đồ và bố cục chuẩn không? Nếu câu trả lời là "không", thì ví dụ về kiểu bố cục tiêu chuẩn, tầm thường không thành POD là gì?

Câu trả lời:


12

Trong C ++ 20, khái niệm POD không được dùng nữa, được cho là bởi vì nó là một đặc điểm tổng hợp vô nghĩa của việc tầm thường và bố cục tiêu chuẩn.

Sai. Thuật ngữ POD đang bị phản đối vì nó không còn quan trọng nữa :

Thuật ngữ POD không còn phục vụ mục đích trong tiêu chuẩn, nó chỉ được xác định và các hạn chế được áp dụng khi một vài loại khác bảo quản tài sản di tích này.

Về cơ bản, một loại cả bố cục tầm thường và bố cục tiêu chuẩn sẽ không đạt được bất kỳ khả năng nào ngoài những gì tầm thường và là bố cục tiêu chuẩn tự cung cấp. Sự kết hợp của cả hai không làm cho loại hình trở nên đặc biệt và hai thuộc tính không thực sự có liên quan nhiều đến nhau.

Bố cục tiêu chuẩn là về cách bố trí các tiểu dự án không trống của nó được xác định rõ (cũng như các tiểu dự án lớp cơ sở trống của nó không làm xáo trộn bố cục của loại). Triviality là về việc đối tượng có một số ý nghĩa ngoài khối bit mà nó lưu trữ (và liệu nó có phải là một đối tượng hợp lệ hay không nếu nó được khởi tạo với một khối bit tùy ý).

Nếu tôi đang tạo một mẫu có một loại Tvà tôi muốn xem liệu tôi có thể memcpyđối tượng của loại đó không, tôi không quan tâm đến bố cục của các thành viên; Tôi muốn biết nếu nó là TrivivelyCopyable. Tương tự, tính chính xác của offsetofviệc không quan tâm một chút nếu lớp có một hàm tạo sao chép do người dùng cung cấp. Tất cả những gì nó quan tâm là nếu bố trí của các tiểu dự án thành viên xảy ra theo một trật tự rõ ràng, được thi hành theo tiêu chuẩn.

Về cơ bản, mọi người nhìn xung quanh và nhận ra rằng không còn gì trong C ++ mà đặc biệt cần sự giao thoa giữa tầm thường và bố cục tiêu chuẩn. Vì vậy, chúng tôi không cần phải đặt một thuật ngữ cho nó. Một vài nơi mà tiêu chuẩn tuyên bố rõ ràng rằng một số loại sẽ là "POD" có thể được thay thế đơn giản bằng "bố cục tầm thường và tiêu chuẩn", nếu phù hợp.

Đây có phải là yêu cầu đệ quy không?

Vì cả hai yêu cầu cấu thành là đệ quy riêng, nên giao điểm của cả hai cũng được đệ quy. Vì vậy, không có nhu cầu rõ ràng để nói rằng tất cả các tiểu dự án cũng là POD. Đây không chỉ là một trường hợp kỳ quặc sao chép và dán, trong đó định nghĩa ban đầu nói một cái gì đó như "tất cả các thành viên dữ liệu không tĩnh phải là loại POD" và họ chỉ giữ nguyên tuyên bố đó.


" Tất cả những gì nó quan tâm là nếu cách bố trí các tiểu dự án thành viên diễn ra theo một trật tự rõ ràng, được thi hành theo tiêu chuẩn " Tại sao std phải thực thi một lệnh để có thể xác định phần bù của thành viên? Có phải mục tiêu của std là cho phép crazy impl nơi các thành viên không có sự bù đắp?
tò mò

1

Bố cục tiêu chuẩn phụ thuộc vào bố cục tiêu chuẩn của các thành viên không tĩnh:

[lớp.prop]

Một lớp S là một lớp bố trí tiêu chuẩn nếu nó:

  • không có thành viên dữ liệu không tĩnh của loại bố cục không chuẩn (hoặc mảng của các loại đó) hoặc tham chiếu,

  • ...

Sự tầm thường cũng phụ thuộc vào sự tầm thường của các thành viên không tĩnh. Để đơn giản, tôi chỉ trích dẫn quy tắc cho hàm tạo mặc định, nhưng các hàm thành viên đặc biệt khác có từ ngữ tương tự:

[class.default.ctor]

Một constructor mặc định là tầm thường nếu nó không do người dùng cung cấp và nếu:

  • ...
  • đối với tất cả các thành viên dữ liệu không tĩnh của lớp thuộc loại lớp (hoặc mảng của chúng), mỗi lớp như vậy có một hàm hủy tầm thường.

Theo như tôi có thể nói, yêu cầu rõ ràng của PODness để áp dụng cho các thành viên là không cần thiết, vì nó cũng hoàn toàn tuân theo các yêu cầu về bố cục tiêu chuẩn và tầm thường.

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.