2014-07-10 2 views
0

Je suis confronté à un problème avec l'initialisation de la valeur mélangée avec l'initialisation agrégée. Jusqu'ici, j'ai essayé de faire toutes mes initialisations comme ceci:Initialisation de la valeur par rapport à l'initialisation de l'agrégat

auto var = Type {};

(Oui, je suis au courant de croisillon-initialiseur cteur vs piège par défaut cteur. Donc pas de commentaires à ce sujet s'il vous plaît!)

Je pense que ce serait bien « mettre à zéro » ou initialiser la mémoire de var.

Mais dans VS 2013 Mise à jour 2, je vois ceci:

#include <string> 
#include <iostream> 

using namespace std; 


struct B 
{ 
    double g[10]; 
    std::string str; 
}; 

struct C 
{ 
    double g[10]; 
}; 

struct A 
{ 
    double a[3]; 
    double b = 0; 
    double d; 
    struct B b_stuff; 
    struct C c_stuff; 
    A() : b_stuff{}, c_stuff{} {} 
}; 

int main() 
{ 
    auto a = A{}; 
    double big[50] = {}; 

    for(auto b : a.b_stuff.g) { cout << b << " "; } 
    cout << endl; 
    cout << endl; 
    for(auto b : a.c_stuff.g) { cout << b << " "; } 
    cout << endl; 
    cout << endl; 
    for (auto b : big) { cout << b << " "; } 

    return 0; 
} 

La sortie est la suivante:

-9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

avec GCC 4.7.2:

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Je lis ce mais je ne vois pas de raison pour ce comportement non-réduction à zéro:

http://en.cppreference.com/w/cpp/language/value_initialization http://en.cppreference.com/w/cpp/language/aggregate_initialization

Donc, est-ce que VS 2013 est buggé? Pourquoi ne met-il pas à zéro le tableau a.b_stuff.g?

+0

Vous avez raison, c'est un bug MSVC. Vous avez correctement initialisé la valeur 'b_stuff' (j'ai manqué cette ligne en écrivant ma réponse). – Manu343726

+0

Huh, "bien". J'ai commencé à paniquer/j'espère avoir manqué quelque chose d'évident. Si c'est vraiment un bug dans MSVC alors c'est une mauvaise nouvelle ... –

+0

Essayez d'utiliser l'initialisation de la valeur en classe, c'est autorisé depuis C++ 11, mais je ne sais pas si les gens de Microsoft l'ont implémenté: http://coliru.stacked-crooked.com/a/e1e6d42289ce54ee – Manu343726

Répondre

Questions connexes