Когда вы удаляете этот конструктор, class A
получает право на совокупную инициализацию , что вызвано здесь этим фигурными скобками синтаксис: A obj1={5,6};
(он также имеет такую эквивалентную форму: A obj1{5,6};
начиная с C ++ 11)
Поскольку вы можете прочитать здесь , это применимо в вашем случае, так как class A
не имеет ничего из следующего:
- частные или защищенные нестатические члены данных (применяется до C ++ 11)
- конструкторы, объявленные пользователем (применяются с C ++ 11 до C ++ 17)
- предоставленные пользователем конструкторы (допускаются явно заданные по умолчанию или удаленные конструкторы) (применяется с C ++ 17 до C ++ 20)
- предоставленные пользователем, унаследованные или явные конструкторы (явно установленные по умолчанию или удаленныеконструкторы допускаются) (применяется с C ++ 20)
- объявленные пользователем или унаследованные конструкторы
- виртуальные, частные или защищенные (применяется с C ++ 17) базовые классы
- виртуальные функции-члены
- инициализаторы-члены по умолчанию(применяется с C ++ 11 до C ++ 14)
Напротив, этот синтаксис: A obj2(9,10);
выполняет прямую инициализацию и он не скомпилируется после удаления конструктора из-за [dcl.init¶17.6.2] :
[...], если инициализация прямая инициализация [...] рассматриваются конструкторы.[...] Если ни один конструктор не применяет [...], инициализация некорректна.
До удаления конструктора тот же синтаксис A obj1={5,6};
вызывал его при выполнении copy-list-initialization .
Что такое совокупная инициализация ?Это инициализация экземпляра агрегатного типа (либо массива, либо структуры / класса, соответствующего приведенному выше списку) с помощью braced-init-list синтаксис.Аргументы внутри фигурных скобок должны совпадать с нестатическими элементами данных struct / class в порядке объявления .В более поздних версиях C ++ он получил значительный импульс, поскольку в язык были добавлены более синтаксические формы для него.Ваше использование ={...}
является единственным существовавшим до C ++ 11.
Общие плюсы и минусы использования скобочных форм инициализации по сравнению с фигурной инициализацией обсуждаются многими.Хорошее место, чтобы получить исчерпывающую информацию - пункт 7 Скотта Мейерса Effective Modern C ++ .При этом главное преимущество всех форм инициализации фигурных скобок заключается в том, что они не допускают сужение .