Я прочитал это в книге:
Синтезированный оператор копирования-назначения определяется как удаленный, если
член имеет удаленный или недоступный оператор копирования-назначения, или если
класс имеет константный или ссылочный член.
И почему мы не можем использовать ссылочный тип?
Вы говорите о конструкторе по умолчанию (а не о переназначении или копировании).
член const, тип которого явно не определяет конструктор по умолчанию
Он запрещает конструктор по умолчанию, иначе у вас будет неинициализированное значение const (так бесполезно). (если бы не было const
тот факт, что он не был инициализирован, не является проблемой, мы можем назначить его позже).
ссылочный член, который не имеет инициализатора в классе
Это также запрещено, так как ссылка похожа на ненулевой константный указатель.
struct NoDefaultConstructor
{
// No default constructor can be generated.
const int i; // which value to set by default ?
int& r; // reference which object by default?
};
struct InClassInitializerSoDefaultConstruct
{
// default constructor is generated here.
const int i = 42;
int j;
int& r = j;
};
Изменить, чтобы ответить отредактировано Q
Для назначения, const
значение не может быть изменено.
и ссылка похожа на ненулевой константный указатель.
Обратите внимание, что конструктор копирования не имеет этого ограничения, потому что вы можете (и должны)
инициализировать значение const`