Может ли инициализация списка не использоваться для частных пользователей?

struct A
{
private:
int a, b, c;
};

int main()
{
A a1{};
A a2 = {};

return 0;
}

Код был скомпилирован с помощью VC ++ 2012 (с последним обновлением «Ноябрь 2012 CTP»).

Я ожидаю, что a1 и a2 инициализируются нулями, но нет. a1 и a2 не инициализируются.

Зачем?

5

Решение

Вы имеете в виду компилятор Microsoft Tech Preview, в котором они даже недостаточно уверены, чтобы называть его бета, имеет ошибки в этом? 😉

Это ошибка; он должен вести себя так, как вы ожидаете. Пожалуйста, сообщите об этом.

7

Другие решения

Обратите внимание, что этот ответ был слегка переписан, что изменило конечный результат на противоположное тому, что было раньше. Благодаря @Дэвид Родригес — дрибеи за то, что просветил меня. 🙂

Это ошибка. 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) типом класса без объединения без предоставленного пользователем конструктора, тогда объект инициализируется нулями […]

А это, в свою очередь, означает, что члены должны быть обнулены.

6

По вопросам рекламы [email protected]