2010-10-17 11 views
5

Ist Demo ein POD-Typ in C++ 03?Plain Old Datentypen mit privaten Mitgliedern?

struct Demo 
{ 
    private: 
     int x; 
     int y; 
}; 

C++ 03, §9p4:

Ein POD-struct ist ein Aggregat Klasse, die nicht-POD-struct, nicht-POD-Union keine nicht-statische Datenelemente vom Typ besitzt (oder Array von solchen Typen) oder Referenz, und hat keinen benutzerdefinierten Kopierzuweisungsoperator und keinen benutzerdefinierten Destruktor.

Nach der Lektüre Steve Jessop's post, ich glaube Demo ein nicht-POD ist, weil die Mitglieder sind privat. Der Standard sagt jedoch nichts über die Beziehung zwischen POD-Typen und Zugriffsmodifizierern aus.

In C++ 0x Demo ist POD weil §9p9 (n3126) sagt:

A POD struct eine Klasse ist, die sowohl eine triviale Klasse und eine Standard-Layout-Klasse ist, und hat keine Nicht statische Datenelemente vom Typ Nicht-POD-Struktur, Nicht-POD-Vereinigung (oder Array solcher Typen).

Demo ist sowie eine Standard-Layout-Klasse trivial, so dass es ein POD ist. Ist meine Interpretation richtig?

Eine triviale Klasse ist eine Klasse, die eine triviale Standardkonstruktors (12.1) und ist trivially kopierbar ist. [9p5, n3126]

+0

Ich würde zustimmen, dass es POD ist. Es scheint, dass Teile der Definition einander widersprechen, da ein Aggregat keine privaten Mitglieder haben kann, aber dann notiert nichts private Mitglieder anderswo. Ob die Mitglieder öffentlich oder privat sind, hat keinen Einfluss auf die Standardvergleichs- und -kopierkonstruktionen. Daher stimme ich zu, dass es sich um ein triviales und daher POD handelt. – JoshD

Antwort

13

In C++ 03 ist es definitiv nicht ein POD. Gemäß § 9/4, "A POD-struct ist ein Aggregat Klasse ...", und nach §8.5.1/1:

Ein Aggregate ein Array oder eine Klasse (Klausel 9) ohne User-deklarierten Konstruktoren (12.1), keine privaten oder nicht-statische Datenelemente geschützt (Ziffer 11), keine Basisklassen (Ziffer 10), und es wird keine virtuellen Funktionen (10.3).“

Unter C++ 0x, zumindest ab N3090/3092, glaube ich, dass es ein POD ist.Diese erfordern nur, dass alle nicht statischen Mitglieder den gleichen Zugriff haben, nicht dass der Zugriff erforderlich ist selten öffentlich. Dies ist ein Problem zu beheben, dass ich glaube, ich war die erste, darauf hinzuweisen - in C++ 98/03, ein vacuous Zugriffsbezeichner führt zu einem Problem:

struct x { 
    int a; 
public: 
    int b; 
public: 
    int c; 
}; 

Dies paßt die Anforderungen einer POD-Struktur - aber der Standard gibt immer noch die Erlaubnis, dass die relativen Positionen von b und c wegen des dazwischenliegenden Zugriffsspezifizierers vertauscht werden. Daher stellt das Vorhandensein einer POD-Struktur keine Layout-Garantien bereit, die die Kompatibilität mit C-Strukturen gewährleisten sollten (für das offensichtliche Beispiel).

+0

Lol, ich habe genau das selbe Beispiel zur gleichen Zeit wie du geschrieben. – Potatoswatter

+0

... und ich sollte RTFM'd haben, C++ 0x hat schon C++ 03 aus meinem Kopf geschoben: vP. +1 – Potatoswatter

+0

Danke !! Wie konnte ich '§8.5.1/1:' vermissen? Wie auch immer, meine Interpretation war korrekt. '' '' –

3

Von C++ 11 am einfachsten ist bei weitem der Compiler mit std::is_pod zu fragen:

#include <iostream> 
#include <type_traits> 

struct Demo 
{ 
    private: 
     int x; 
     int y; 
}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_pod<Demo>::value << std::endl; 
} 

wahr

Verwandte Themen