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