Я сталкиваюсь с проблемой инициализации значения, смешанной с инициализацией агрегата.
До сих пор я пытался полагаться на выполнение всех моих инициализаций следующим образом:
auto var = Type {};
(Да, я знаю о том, что ctra-initializer ctor vs по умолчанию ctor ловушка. Так что, пожалуйста, никаких комментариев об этом!)
Я ожидаю, что это правильно «обнулит» или инициализирует память var.
Но в VS 2013 Update 2 я вижу это:
#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;
}
Выход такой:
-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
С 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
Я прочитал это, но я не вижу причины для такого поведения, не равного нулю:
http://en.cppreference.com/w/cpp/language/value_initialization
http://en.cppreference.com/w/cpp/language/aggregate_initialization
Итак, VS 2013 глючит? Почему он не обнуляет массив a.b_stuff.g?
Visual C ++ имеет длинная и легендарная история ошибок инициализации значения. я верю Ошибка 746973 это тот, кого вы наткнулись здесь.