Std :: is_pod neden C ++ 20'de kullanımdan kaldırıldı?


92

std::is_podmuhtemelen C ++ 20'de kullanımdan kaldırılacaktır.
Bu seçimin sebebi nedir? std::is_podBir türün gerçekte POD olup olmadığını bilmek yerine ne kullanmalıyım ?



3
Bir türün POD olup olmadığını neden bilmek istiyorsunuz?
Marc Glisse

8
@MarcGlisse Standart veya bunun gibi bir özellikteki değişikliklerle ilgili bir soru, o özelliği kullanmak istediğim anlamına gelmez. Kullanımdan kaldırılan notu Google'da buldum ve neden kullanımdan kaldırıldığını merak ettim.
skypjack

Sorum aslında dolaylı bir cevaptı: kaldırıldı çünkü (kabaca) bir türün POD olup olmadığını sormak için bir neden yok.
Marc Glisse

3
Bunu static_assert, C koduyla paylaşılması gereken yapılara kimsenin dokunmamasını sağlamak için kullanırdım .
Mirko

Yanıtlar:


70

POD, daha fazla nüans veren iki kategori ile değiştiriliyor. Kasım 2017 c ++ standardı toplantı bu konuda şunları söyledi:

"Düz eski veri" (POD) kavramını geçersiz kılıyor. Yerine iki farklı tür kategorisi daha eklendi: "önemsiz" ve "standart düzen". "POD", "önemsiz ve standart düzene" eşdeğerdir, ancak birçok kod örüntüsü için, yalnızca "önemsiz" veya yalnızca "standart düzen" için daha dar bir sınırlama uygundur; bu tür bir hassasiyeti teşvik etmek için, "POD" kavramı bu nedenle kullanımdan kaldırıldı. Kitaplık özelliği is_pod da buna uygun olarak kullanımdan kaldırılmıştır.

Basit veri türleri için is_standard_layoutişlevi, önemsiz veri türleri için (basit yapılar gibi) is_trivialişlevi kullanın .


4
Yani, remove_cvrefbir tarafa bu birleşik bir özellik eklerken, diğer taraftan diğer birleşik özellikleri kaldırıyorlar mı? Çılgınca görünüyor. :-)
skypjack

6
Önemsiz VE standart bir düzen VE yinelemeli POD olmayı içeren bir cümle gibi görünüyor. Özyinelemeli cümle gereksiz mi? Yani, garantili std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})mi?
Yakk - Adam Nevraumont

3
@skypjack: POD'u kaldırmanın amacı, artık bir amaca hizmet etmemesidir. "Önemsiz" ve "standart düzen" bileşimi aslında C ++ 'da hiçbir şey ifade etmez ve gerçekte yaptığınız şeye bağlı olarak "önemsiz" veya "standart düzen" yerine POD ile bir arabirimi kısıtlamanız için hiçbir neden yoktur. Bununla. Buna karşılık, "cvref" i kaldırmak bir şey ifade eder; ortaya çıkan tür, niteleyici içermeyen bir nesne türüdür.
Nicol Bolas

5
Bu değişikliği gerçekten takdir ediyorum. Bir sistem yazılım programcısı olarak, "standart düzen" başından beri gerçekten önemsediğim şeydi ve POD'ların yapıcılara sahip olmama gerekliliği, onların ortak "kurucularla yapılar" deyimimi düzgün bir şekilde tanımlamamasına neden oldu. Önceden bu "sahte POD'lar" olarak adlandırmak zorunda kaldım. Sevimli, ancak kodunuzda sahte ayaklılardan bahsettiğinizde bazı anime hayranlarının size komik görünmesini sağlar.
TED

2
Are std::is_pod, std::is_triviave std::is_standard_layoutderleme zamanı? Çünkü algoritmalarda, eğer C düzeni uyumluysa memcpy () vb. Kullanarak daha hızlı bir algoritma isteyebilirsiniz.
SJHowe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.