2015-04-28 16 views
26

Questo è circa std::is_pod, che rileva se un modello è un tipo di dati vecchio vecchio oppure no.Perché questo non è un POD?

vedere il codice seguente:

struct A { 
public: 
    int m1; 
    int m2; 
}; 

struct B { 
public: 
    int m1; 
private: 
    int m2; 
}; 

struct C { 
private: 
    int m1; 
    int m2; 
}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_pod<A>::value << '\n'; // true 
    std::cout << std::is_pod<B>::value << '\n'; // false 
    std::cout << std::is_pod<C>::value << '\n'; // true 
} 

I 3 struct tutti sembrano POD per me. Ma apparentemente struct B non lo è. Non capisco perché. Per me, hanno tutti un banale costruttore, spostare e copiare l'operatore. Anche il distruttore è certamente banale.

Do la colpa a utilizzando 2 specificatori di accesso, ma non riesco a trovare informazioni su questo.

+0

http://en.cppreference.com/w/cpp/types/is_pod – juanchopanza

+2

Per quelli di noi pigri per fare clic sul link @ juanchopanza, POD = plain old data type –

risposta

31

secondo lo standard (9 Classi [class], sottolineatura mia):

Una classe standard di layout è una classe che:

...

- ha lo stesso controllo di accesso (Articolo 11) per tutti n on-static membri di dati,

...

e

Un POD struct è una classe non-unione che è al tempo stesso una classe banale e uno standard -solo classe e ...

L'intuizione è corretta, perché B.m1 e B.m2 sono entrambi non statici e hanno un controllo di accesso diverso.