В сообщении об ошибке четко указано, что конструктор по умолчанию был удален неявно . Он даже говорит, почему: класс содержит нестатическую переменную const, которая не будет инициализирована ctor по умолчанию.
class X {
const int x;
};
Поскольку он X::x
есть const
, он должен быть инициализирован, но ctor по умолчанию обычно не инициализирует его (потому что это тип POD). Следовательно, чтобы получить ctor по умолчанию, вам нужно определить его самостоятельно (и он должен инициализироваться x
). Вы можете получить такую же ситуацию с членом, который является ссылкой:
class X {
whatever &x;
};
Вероятно, стоит отметить, что оба они также отключают неявное создание оператора присваивания, по сути, по той же причине. Оператор неявного присваивания обычно выполняет присваивание по членам, но с константным или ссылочным членом он не может этого сделать, потому что член не может быть назначен. Чтобы присваивание работало, вам нужно написать собственный оператор присваивания.
Вот почему const
член обычно должен быть статическим - когда вы выполняете назначение, вы все равно не можете назначить член const. В типичном случае все ваши экземпляры будут иметь одно и то же значение, поэтому они могут также иметь общий доступ к одной переменной вместо того, чтобы иметь множество копий переменной, которые все будут иметь одно и то же значение.
Конечно, можно создавать экземпляры с разными значениями - вы (например) передаете значение при создании объекта, поэтому два разных объекта могут иметь два разных значения. Однако если вы попытаетесь сделать что-то вроде их замены, член const сохранит свое исходное значение вместо того, чтобы быть замененным.