Я читал эту страницу, чтобы понять концепцию инициализации значения
http://en.cppreference.com/w/cpp/language/value_initialization
Эффекты инициализации значения:
- Если T является типом класса по крайней мере с одним предоставленным пользователем конструктором любого вида, вызывается конструктор по умолчанию.
Но это, кажется, находится в прямом противоречии с другими источниками, объясняющими, что если есть хотя бы пользовательский конструктор, то компилятор не генерирует неявный конструктор по умолчанию (выражения типа «T t;» не будут компилироваться). Любое объяснение приветствуется.
«Конструктор по умолчанию» в данном контексте означает конструктор, который не может принимать аргументы (либо потому, что у него нет параметров, либо потому, что он имеет только необязательные параметры).
«Неявный конструктор» означает конструктор, сгенерированный для вас автоматически. Это может быть конструктор без аргументов, конструктор копирования или (начиная с C ++ 11) конструктор перемещения.
Таким образом, нет никакого противоречия. Когда T является типом класса с предоставленным пользователем конструктором, тогда инициализация значения вызывает конструктор по умолчанию. Если этого не существует (потому что вы определили другой конструктор, но нет конструктора без аргументов), или если он недоступен (потому что вы пометили его как частный или защищенный, а затем использовали его из места, которое не может использовать такие функции), тогда значение инициализация неверна, и компилятор отклонит ваш код. Если он объявлен, но не определен, программа не будет связываться.
Начиная с C ++ 11 слово «default», вероятно, несколько двусмысленно, так как можно определить конструктор копирования = default;
Других решений пока нет …