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?
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
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 ... –
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