2017-10-20 30 views
4

J'écris du code pour un microcontrôleur, et je dois m'assurer que ma structure est un POD. Je pensais pouvoir utiliser une "liste d'initialisation de membre" pour initialiser les membres, mais cela ne passe pas le test "is_pod". Dans l'exemple ci-dessous, A est un POD, B et C ne le sont pas. Ajout de "D() = par défaut;" à D semble en faire un POD. Mais, en faisant cela, je ne peux plus avoir de "listes d'initialisation de membre"? Existe-t-il un moyen pour une structure d'être un POD et d'avoir une "liste d'initialisation de membre"?C++ Struct échoue au test POD

#include <iostream> 
#include <string> 

struct A { 
    int var1; 
}; 

struct B { 
    int var1; 
    //B() = default; 
    B() : var1(100) {} 
}; 

struct C { 
    int bar [10]; 
    C() : bar{0} {} 
}; 

struct D { 
    int var1; 
    D() = default; 
    //D(int x) : var1(x) {} 
}; 


int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << "\nIs A a POD = " << std::is_pod<A>::value; 
    std::cout << "\nIs B a POD = " << std::is_pod<B>::value; 
    std::cout << "\nIs C a POD = " << std::is_pod<C>::value; 
    std::cout << "\nIs tD a POD = " << std::is_pod<D>::value; 
} 

Mise à jour === 1 ===
Merci pour les réponses! Donc, semble qu'il n'y a aucun moyen d'initialiser les variables membres dans la définition de la structure. Les travaux suivants, mais n'est pas aussi élégant que d'avoir l'initialisation dans la structure elle-même.

typedef struct A_ { 
int var1; 
} A; 

A a = { 
    .var1 = 100 
}; 
+2

Handy reading: http://www.cppreference.com/w/cpp/concept/PODType – user4581301

+2

C'est un peu énigmatique lors de la relecture. Je pense que vous obtenez de-PODed par l'absence d'un constructeur par défaut. La déclaration d'un constructeur supprime le constructeur par défaut sauf si vous contredisez en déclarant explicitement un constructeur par défaut. – user4581301

+2

Je crois que vous ne pouvez pas avoir d'initialisation personnalisée dans la structure de type pod. –

Répondre

0

POD doit être un trivial type, cela nécessite:

a un ou plusieurs constructeurs par défaut, tous dont sont soit trivial ou supprimé, et au moins un dont n'est pas supprimé.

Et un constructeur trivial a une description de l'exécution aucune action. Donc "ayant l'initialisation dans la structure elle-même" est explicitement contre.

Les exigences difficiles de votre intérêt sont:

  • Le constructeur n'est pas fourni par l'utilisateur (par exemple, est implicitement défini ou fait défaut sur sa première déclaration)
  • Chaque membre non-statique type de classe a un constructeur par défaut trivial est qu'il doit être par défaut, tous les membres constructeurs ont

Vous devez utiliser le constructeur par défaut pour var1 dans la définition du constructeur. C'est à dire. var1(100) est "non bueno". (Note de côté: vous pouvez utiliser un membre ctor mais seulement sous une forme par défaut, par exemple var1(), ce qui équivaut à l'omettre).

Veuillez noter qu'il existe une différence majeure dans l'utilisation de l'initialisation agrégée dans la déclaration de l'objet, par rapport à la définition par défaut. Il faut du travail pour définir ces variables, et une création par défaut d'un POD "ne peut en avoir aucune".