Почему создаётся объект не имеющий конструкторов вообще?

Почему можно создать создать объект с удаленным конструктором, если описание класса имеет такую форму:

class MyClass
{
public:
   MyClass()=delete;
   int a;
};
MyClass a{1}; //все хорошо

А если класс имеет такую форму:

class MyClass
{
   int a;
public:
   MyClass()=delete;
};
MyClass a; //ошибка

То компилятор выбивает ошибку.
Попробую предложить, что все дело тут в агрегатной инициализации, но неужели она может полностью заменить конструктор? Объясните пожалуйста.


Ответы (1 шт):

Автор решения: αλεχολυτ

Поведение приведённого кода будет отличаться в зависимости от используемого стандарта языка. До C++20 удаление конструктора через =delete не отменяло возможности агрегатной инициализации. В C++20 это уже запрещено. По этому поводу имеется соответствующий документ P1008R1. Связанный ответ на enSO.

→ Ссылка