Правила C ++ просто говорят, что инициализация по умолчанию (например, new T;
) и инициализация значения (например, new T();
) одинаковы для объектов типа класса, но не для объектов фундаментального типа.
Вы ничего не можете сделать, чтобы "преодолеть" это различие.Это фундаментальная часть грамматики.Если ваш класс является инициализируемым по значению, то он также инициализируется по умолчанию.
Для классов без каких-либо пользовательских конструкторов существует своего рода исключение: в этом случае инициализация членов выполняется рекурсивно (поэтомуесли вы по умолчанию инициализируете объект, он попытается инициализировать по умолчанию все члены), и это не удастся, если какой-либо из классов члены сами по себе являются фундаментальными, или опять-таки такого типа.
Например, рассмотрим следующие два класса:
struct Foo { int a; int b; };
struct Goo { int a; int b; Goo(){} };
//const Foo x; // error
const Goo y; // OK
Неявный конструктор для Foo
отклонен, поскольку он не инициализирует фундаментальные члены.Однако y
успешно инициализируется по умолчанию, а y.a
и y.b
теперь "намеренно оставлены пустыми".
Но если в вашем классе нет пользовательских конструкторов, эта информация будет выигранатебе не поможетВы не можете "переслать" тип инициализации члену (например, Foo() : INIT_SAME_AS_SELF(a), b() { }
).