std::is_pod
có 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?
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.
std::is_pod
có 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?
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.
Câu trả lời:
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_layout
hà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_trivial
hàm.
remove_cvref
và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ồ. :-)
std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})
không?
std::is_pod
, std::is_trivia
và std::is_standard_layout
thờ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.