Рассмотрим код
#include "stdafx.h"#include <Windows.h>
#include <iostream>
struct B
{
public:
void f() { for (auto &v : member) { std::cout << v << std::endl; } }
private:
int member[100];
};
int main()
{
B b{};
b.f();
}
Я думаю, что этот код руководствуется $ 8.5.4 / 3
Инициализация списка объекта или ссылки типа T определяется следующим образом: - Если список инициализаторов не имеет элементов и T является типом класса с конструктором по умолчанию, объект инициализируется значением.
Вместо этого компилятор VS2013 испускает все 0xCCCCCCCC, подразумевая, что он оставляет все элементы b.member как неинициализированные. Таким образом, кажется, что он выполняет инициализацию по умолчанию вместо инициализации значения.
Пожалуйста, дайте мне знать, если я что-то упустил.
Ваш пример кода может быть упрощен еще больше.
#include <iostream>
struct B
{
public:
void f() { std::cout << member << std::endl; }
private:
int member;
};
int main()
{
B b{};
b.f();
}
Это производит вывод:
-858993460
который 0xCCCCCCCC
в шестнадцатеричном виде шаблон отладки, которым компилятор VC заполняет память в сборках отладки. Кажется, это известная ошибка с VS2012 и VS2013 как сообщили здесь.
Вы можете обойти ошибку, определив конструктор, значение которого инициализирует элемент данных индивидуально. В вашем случае добавление этого конструктора приведет ко всем элементам member
являющийся 0
B() : member{} {}
Что вы хотите сказать, это:
int main()
{
B b = {}; // = {} expresses that you want to zero-init the member vars
b.f();
}
Если B имеет (не по умолчанию) конструктор или какие-либо члены с конструкторами, приведенный выше пример использования кода ={}
может генерировать ошибку компилятора.