Есть ли разница между инициализацией структуры этими двумя способами:
structVar = {}
а также
structVar = {0}
исправленный
Если структура является совокупностью, то 2 определения выполняют одно и то же. Из стандарта С++ 11 (N3337):
8.5.1/7 Если в списке меньше предложений-инициализаторов, чем членов в совокупности, то каждый элемент, который явно не инициализирован, должен быть инициализирован из своего элемента-выравнивателя или, если нет скобки или -equal-initializer из пустого списка инициализаторов (8.5.4).
Если структура содержит два члена, например
struct S
{
int x;
double y;
};
то structVar = {}
будет инициализировать элементы-члены, то есть они станут нулевыми (или если члены не являются POD, будет вызываться по умолчанию ctor).
Строка structVar = {0}
будет инициализировать только первый член структуры с нулем. Поскольку в этом случае у вас есть совокупность, остальные члены инициализируются по пустым спискам, поэтому у вас есть
structVar = {0, {} };
В С++ 14 была добавлена возможность агрегатной инициализации для агрегатов, содержащих элементы с равными или равными значениями, т.е.
struct S
{
int x;
double y{1.1}; // or double y = 1.1;
}
В этом случае,
structVar = {0};
инициализирует x
с 0 и y
с 1.1. Это было невозможно до С++ 14.
PS: просто проверил код выше, clang++ компилирует его с помощью -std=c++1y
, однако g++ 4.9.2 отклоняет его, даже если я скомпилирую с -std=c++14
.
structVar = {0}
инициализирует все оставшиеся элементы
char a[10] = {'a'}
выполняет инициализацию значения для остальных элементов массива ...
Это действительно зависит от характера структуры.
Если это совокупность, они в основном эквивалентны. Однако первый из них является общим в том смысле, что он просто value-инициализирует структуру. Второй требует, чтобы первый элемент структуры был инициализирован с помощью 0
и инициализировал остальные элементы, как если бы каждый из них инициализировался пустым инициализатором {}
, другими словами,
structVar = {0, {}, {}, {}, ..... };
поэтому каждый оставшийся элемент инициализируется значением.
Если это не совокупность, то это зависит от того, какие конструкторы, если таковые имеются, были предоставлены. Просто не хватает информации, чтобы сказать.