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?
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_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?
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_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.
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ồ. :-)
std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})không?
std::is_pod, std::is_triviavà std::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.