struct A
{
private:
int a, b, c;
};
int main()
{
A a1{};
A a2 = {};
return 0;
}
Код был скомпилирован с помощью VC ++ 2012 (с последним обновлением «Ноябрь 2012 CTP»).
Я ожидаю, что a1 и a2 инициализируются нулями, но нет. a1 и a2 не инициализируются.
Зачем?
Вы имеете в виду компилятор Microsoft Tech Preview, в котором они даже недостаточно уверены, чтобы называть его бета, имеет ошибки в этом? 😉
Это ошибка; он должен вести себя так, как вы ожидаете. Пожалуйста, сообщите об этом.
Обратите внимание, что этот ответ был слегка переписан, что изменило конечный результат на противоположное тому, что было раньше. Благодаря @Дэвид Родригес — дрибеи за то, что просветил меня. 🙂
Это ошибка. Clang 3.2 trunk и GCC 4.7+ тоже согласны и инициализируют нуля участников.
Время для некоторого стандартного. Обратите внимание, что T x{};
(или же = {}
) может быть интерпретирован как инициализация списка или же агрегатная инициализация. A
здесь не совокупный потому что он имеет частные члены, и как таковой не может быть инициализирован последними.
§8.5.1 [dcl.init.aggr] p1
совокупный является массивом или классом (раздел 9) без […] закрытых или защищенных нестатических элементов данных […]
Это оставляет только инициализацию списка, и это будет инициализировать оба значения a1
а также a2
,
§8.5.1 [dcl.init.list] p3
Инициализация списка объекта или ссылки типа
T
определяется следующим образом:
- Если список инициализатора не имеет элементов и
T
тип класса с конструктором по умолчанию, объект инициализируется значением
Значение-инициализация определяется следующим образом для нашего конкретного случая:
§8.5 [dcl.init] p7
если
T
является (возможно, квалифицированным по cv) типом класса без объединения без предоставленного пользователем конструктора, тогда объект инициализируется нулями […]
А это, в свою очередь, означает, что члены должны быть обнулены.