Tại sao std :: is_pod không được dùng trong C ++ 20?


92

std::is_podcó thể sẽ không được chấp nhận trong C ++ 20.
Lý do cho sự lựa chọn này là gì? Tôi nên sử dụng gì std::is_podđể biết một loại có thực sự là POD hay không?



3
Tại sao bạn muốn biết một loại có phải là POD không?
Marc Glisse

8
@MarcGlisse Một câu hỏi về những thay đổi trong tiêu chuẩn hoặc một đặc điểm như thế này không nhất thiết có nghĩa là tôi muốn sử dụng tính năng đó. Tôi đã tìm thấy ghi chú không dùng nữa trong khi googling và tôi chỉ tò mò muốn biết lý do tại sao nó không được dùng nữa.
skypjack

Câu hỏi của tôi thực sự là một câu trả lời gián tiếp: nó đã bị xóa vì (đại khái) không có lý do gì để hỏi liệu một loại có phải là POD hay không.
Marc Glisse

3
Tôi sẽ sử dụng nó cho một static_assertđể đảm bảo không ai chạm vào cấu trúc nên được chia sẻ với mã C.
Mirko

Câu trả lời:


70

POD đang được thay thế bằng hai danh mục mang lại nhiều sắc thái hơn. Cuộc họp tiêu chuẩn c ++ vào tháng 11 năm 2017 đã nói về điều này:

Không dùng khái niệm "dữ liệu cũ thuần túy" (POD). Nó đã được thay thế bằng hai loại loại sắc thái hơn, "tầm thường" và "bố cục tiêu chuẩn". “POD” tương đương với “bố cục thông thường và chuẩn”, nhưng đối với nhiều mẫu mã, giới hạn hẹp hơn chỉ “tầm thường” hoặc chỉ “bố cục chuẩn” là phù hợp; do đó, để khuyến khích độ chính xác như vậy, khái niệm "POD" đã không còn được dùng nữa. Đặc điểm thư viện is_pod cũng đã không còn được dùng nữa.

Đối với các kiểu dữ liệu đơn giản, hãy sử dụng is_standard_layouthàm, đối với các kiểu dữ liệu tầm thường (chẳng hạn như cấu trúc đơn giản), hãy sử dụng is_trivialhàm.


4
Vì vậy, họ thêm remove_cvrefvào một mặt, đó là đặc điểm cấu tạo, trong khi mặt khác họ loại bỏ các đặc điểm cấu tạo khác? Nó có vẻ điên rồ. :-)
skypjack

6
Nó dường như là bố cục tiêu chuẩn AND tầm thường VÀ một mệnh đề liên quan đến việc được POD đệ quy. Mệnh đề đệ quy có thừa không? Tức là nó có đảm bảo std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})không?
Yakk - Adam Nevraumont

3
@skypjack: Điểm của việc xóa POD là nó không còn phục vụ mục đích nào nữa. Thành phần "tầm thường" và "bố cục chuẩn" không thực sự có ý nghĩa gì trong C ++ và không có lý do gì bạn hạn chế giao diện cho POD hơn là "bố cục tầm thường" hoặc "bố cục chuẩn" dựa trên những gì bạn đang thực sự làm với nó. Ngược lại, loại bỏ "cvref" có nghĩa là một cái gì đó; loại kết quả là một loại đối tượng không có định nghĩa.
Nicol Bolas

5
Tôi thực sự đánh giá cao sự thay đổi này. Là một lập trình viên phần mềm hệ thống, "bố cục tiêu chuẩn" thực sự là điều tôi quan tâm và yêu cầu đối với các POD không có hàm tạo đã khiến chúng không mô tả đúng thành ngữ "cấu trúc có cấu trúc" phổ biến của tôi. Trước đây tôi buộc phải gọi những "POD giả" đó. Dễ thương, nhưng nó khiến một số người hâm mộ anime nhất định nhìn bạn buồn cười khi bạn nói về việc có giả trong mã của bạn.
TED

2
std::is_pod, std::is_triviastd::is_standard_layoutthời gian biên dịch? Bởi vì trong các thuật toán, bạn có thể mong muốn một thuật toán nhanh hơn bằng cách sử dụng memcpy (), v.v. nếu bố cục C tương thích.
SJHowe
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.