Mengapa std :: is_pod tidak digunakan lagi di C ++ 20?

92

std::is_podmungkin tidak akan digunakan lagi di C ++ 20.
Apa alasan dari pilihan ini? Apa yang harus saya gunakan sebagai pengganti std::is_poduntuk mengetahui apakah suatu jenis sebenarnya adalah POD?

skypjack
sumber
3
Mengapa Anda ingin tahu apakah suatu jenis adalah POD?
Marc Glisse
8
@MarcGlisse Pertanyaan tentang perubahan dalam standar atau sifat seperti ini tidak berarti saya ingin menggunakan fitur itu. Saya menemukan catatan yang tidak berlaku lagi saat mencari Google dan saya hanya ingin tahu mengapa itu tidak berlaku lagi.
skypjack
Pertanyaan saya sebenarnya merupakan jawaban tidak langsung: itu telah dihapus karena (secara kasar) tidak ada alasan untuk menanyakan apakah suatu jenis adalah POD.
Marc Glisse
3
Saya akan menggunakannya untuk static_assertmemastikan tidak ada yang menyentuh struct yang harus dibagikan dengan kode C.
Mirko

Jawaban:

70

POD diganti dengan dua kategori yang memberi nuansa lebih. The pertemuan c ++ standar di November 2017 mengatakan ini tentang hal itu:

Menghentikan gagasan "data lama biasa" (POD). Ini telah diganti dengan dua kategori yang lebih bernuansa jenis, "sepele" dan "tata letak standar". “POD” setara dengan “tata letak biasa dan biasa”, tetapi untuk banyak pola kode, batasan yang lebih sempit ke hanya “sepele” atau hanya “tata letak standar” adalah tepat; untuk mendorong ketepatan seperti itu, gagasan "POD" tidak digunakan lagi. Sifat library is_pod juga sudah tidak digunakan lagi.

Untuk tipe data sederhana gunakan is_standard_layoutfungsi, untuk tipe data sepele (seperti struct sederhana) gunakan is_trivialfungsi.

DJ Klomp
sumber
4
Jadi, mereka menambahkan remove_cvrefdi satu sisi, itu adalah sifat tersusun, sedangkan di sisi lain mereka menghilangkan sifat tersusun lainnya? Sepertinya gila. :-)
skypjack
6
Tampaknya sepele DAN tata letak standar DAN klausul yang melibatkan POD rekursif. Apakah klausa rekursif berlebihan? Yaitu, apakah dijamin itu std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})?
Yakk - Adam Nevraumont
3
@skypjack: Inti dari menghapus POD adalah bahwa POD tidak lagi memiliki tujuan. Komposisi "sepele" dan "tata letak standar" sebenarnya tidak berarti apa-apa di C ++, dan tidak ada alasan mengapa Anda membatasi antarmuka ke POD daripada "sepele" atau "tata letak standar" berdasarkan apa yang sebenarnya Anda lakukan dengan itu. Sebaliknya, menghapus "cvref" berarti sesuatu; tipe yang dihasilkan adalah tipe objek tanpa kualifikasi.
Nicol Bolas
5
Saya sangat menghargai perubahan ini. Sebagai pemrogram perangkat lunak sistem, "tata letak standar" adalah hal yang saya pedulikan selama ini, dan persyaratan untuk POD yang tidak memiliki konstruktor membuat mereka tidak mendeskripsikan idiom "struct dengan konstruktor" umum saya. Sebelumnya saya terpaksa memanggilnya "Pseudo-PODs". Lucu, tetapi itu membuat penggemar anime tertentu terlihat lucu ketika Anda berbicara tentang memiliki pseudopod di kode Anda.
TED
2
Apakah std::is_pod, std::is_triviadan std::is_standard_layoutwaktu kompilasi? Karena dalam algoritme, Anda mungkin menginginkan algoritme yang lebih cepat menggunakan memcpy () dll jika kompatibel dengan C-layout.
SJHowe