POD türü olmak önemsiz, standart düzen türüne tam olarak eşdeğer mi?


22

C ++ 20'de, POD kavramı, varsayılan ve önemsiz olmanın anlamsız bir kompozit özelliği olduğu için kullanımdan kaldırılmıştır. Bununla birlikte, C ++ 20 taslağındaki POD'un tanımı tam olarak "hem önemsiz hem de standart düzen" değildir; aslında:

POD sınıfı, hem önemsiz bir sınıf hem de standart mizanpaj sınıfı olan ve POD sınıfı olmayan sınıfın (veya dizisinin) statik olmayan veri üyelerine sahip olmayan bir sınıftır. POD türü, skaler tip, POD sınıfı, bu tür bir dizi veya bu türlerden birinin cv onaylı sürümüdür.

Başka bir deyişle, hem önemsiz hem de standart düzende bir POD tipi değil, aynı zamanda özyinelemeli olarak da öyle.

Bu özyinelemeli gereklilik gereksiz mi? Başka bir deyişle, bir tür hem önemsiz hem de standart düzen ise, otomatik olarak özyinelemeli ve standart düzen de mi? Cevap "hayır" ise, POD olamayan standart düzen, önemsiz türde bir örnek nedir?

Yanıtlar:


12

C ++ 20'de, POD kavramı, varsayılan ve önemsiz olmanın anlamsız bir kompozit özelliği olduğu için kullanımdan kaldırılmıştır.

Yanlış. Çünkü terim POD kaldırılmasına karar verildi artık önemli :

POD terimi artık standartta bir amaca hizmet etmiyor, sadece tanımlanıyor ve birkaç başka tür bu izleyici özelliği koruduğunda kısıtlamalar uygulanıyor.

Esasen, hem önemsiz hem de standart düzen olan bir tür, önemsiz olmanın ve standart düzen olmanın kendi başına sağladığı şeyin ötesinde herhangi bir yetenek kazanmaz. Bu ikisinin birleşimi türü özel yapmaz ve iki özelliğin birbirleriyle pek alakası yoktur.

Standart mizanpaj, boş olmayan alt nesnelerinin mizanpajının iyi tanımlanmış olması (ve tipin mizanpajını bozmayan boş temel sınıf alt nesneleri) ile ilgilidir. Önemsizlik, nesnenin sakladığı bit bloğunun ötesinde bir anlamı olup olmadığı (ve keyfi bir bit bloğu ile başlatılırsa kavramsal olarak geçerli bir nesne olup olmadığı) ile ilgilidir.

Bir tür alan bir şablon Tyapıyorsam memcpyve bu tür nesneler olup olmadığımı görmek istiyorsam , üyelerinin düzenini umursamıyorum; Önemsiz olarak kopyalanabilir olup olmadığını bilmek istiyorum. Benzer şekilde, offsetofsınıfın kullanıcı tarafından sağlanan bir kopya oluşturucusu varsa , doğruluğu en ufak bir önem arz etmez. Tek dikkat ettiği şey, üye alt nesnelerin düzeninin açık ve standart olarak uygulanan bir sırada olması.

Temel olarak, insanlar etrafına baktı ve C ++ 'da özellikle önemsizliğin ve standart düzenin kesişimine ihtiyaç duymayan hiçbir şeyin kalmadığını fark etti . Yani bunun için bir şart ayırmamız gerekmiyor. Standardın bir tür "POD" olacağını açıkça belirttiği birkaç yer, uygun şekilde "önemsiz ve standart düzen" ile değiştirilebilir.

Bu özyinelemeli gereklilik gereksiz mi?

Kurucu gerekliliklerin her ikisi de ayrı ayrı özyinelemeli olduğundan, ikisinin kesişimi de özyinelemelidir. Bu nedenle, tüm alt nesnelerin de POD olduğunu belirtmek için açık bir ihtiyaç yoktur. Bu muhtemelen, kopyalamanın ve yapıştırma tuhaflığının bir örneğiydi, burada orijinal tanım "statik olmayan tüm veri üyeleri POD türleri olmalı" gibi bir şey söyledi ve bu ifadeyi olduğu gibi tuttular.


" Önemli olan tek şey, üye alt nesnelerin düzeninin açık ve standart olarak zorlanmış bir düzende gerçekleşmesidir. " STD bir üyenin ofsetini belirleyebilmek için neden bir emri uygulamak zorunda kalacaktır? Üyelerin ofseti olmadığı çılgın impl'e izin vermek std'nin bir amacı mı?
curiousguy

1

Standart düzen, statik olmayan üyelerin standart düzenine bağlıdır:

[Class.prop]

S sınıfı, aşağıdaki durumlarda standart mizanpaj sınıfıdır:

  • standart olmayan mizanpaj sınıfı (veya bu tür bir dizi) veya başvuru türünde statik olmayan veri üyeleri yoksa,

  • ...

Önemsizlik, statik olmayan üyelerin önemsizliğine de bağlıdır. Kısacası, yalnızca varsayılan kurucu için kuraldan alıntı yaptım, ancak diğer özel üye işlevleri benzer ifadelere sahip:

[Class.default.ctor]

Varsayılan bir kurucu, kullanıcı tarafından sağlanmadıysa ve eğer:

  • ...
  • sınıfının sınıf türü (veya dizisi) olan statik olmayan tüm veri üyeleri için, bu tür her sınıfın önemsiz bir yıkıcısı vardır.

Anlayabildiğim kadarıyla, PODness'ın üyelere uygulanması için açık gereksinimi gereksizdir, çünkü aynı zamanda örtülü olarak standart düzen ve önemsiz olmanın gerekliliklerinden de kaynaklanmaktadır.

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.