foo x=foo()
является copy initialization,
Инициализирует объект из другого объекта
и foo()
является value initialization.
Это инициализация, выполняемая, когда переменная сконструирована с пустым инициализатором.
foo x={}
является aggregate initialization.
инициализацию агрегата из рамно-инициализации-листа
Если количество инициализатора пунктов меньше, чем число членов и оснований (так как C++, 17) или список инициализатора полностью пусто, остальные члены и базы (начиная с C++ 17) инициализируются их инициализаторами по умолчанию, если они указаны в определении класса, и в противном случае (начиная с C++ 14) пустым списком, который выполняет инициализацию значения.
Таким образом, результат будет таким же в этом случае (оба значения инициализированы).
И эффекты инициализации значения в данном случае являются:
если T является типом класса с конструктором по умолчанию, который не является ни предоставленный пользователем и не удаляется (то есть, это может быть класс с неявно или определяемого по умолчанию конструктор по умолчанию), то объект нулевой инициализируется
Наконец эффекты нулевой инициализации в данном случае являются:
Если Т скалярная тип, начальное значение объекта является интегралом константа равна нулю явно преобразуется в T.
Если T является несрастание тип класса, все базовые классы и не-статические данные члены равны нулю инициализирован, и все padding инициализируется до нуля бит. Конструкторы, если они есть, игнорируются.