Вы не изменяете const string
. Вы его инициализируете.
const
означает, что после инициализации переменной ее нельзя изменить. Это не означает constexpr
(что означает выражение постоянной времени компиляции).
const
значения могут быть установлены во время выполнения. Например:
#include <iostream>
int main() {
int x;
std::cin >> x;
const int y = x; // This is totally fine.
std::cout << "You entered the number " << y;
}
В приведенном выше примере, значение y
определяется во время выполнения (после считывания значения x
). Он инициализируется значением x
, и после его инициализации мы не можем изменить его значение. *
Это то же самое с членом const
.
Изменение переменная подразумевает, что она существует, имеет значение, а затем вы устанавливаете ее на новое значение. Здесь дело не в этом. Переменная/member не существует, пока не будет вызван конструктор. Поскольку он не существует, он не может иметь какое-то предыдущее значение. Вместо этого вы создаете переменную/член и даете ей ее (первое и единственное) значение, все в одно и то же время (это то, что мы имеем в виду, когда говорим об инициализации). В этом процессе нет .
* const_cast
позволяет нам изменить значение ссылки const
на переменную, которая первоначально не была const
. Таким образом, обходные пути существуют. Но если исходная переменная (а не только ссылка) равна const
, вы будете вызывать неопределенное поведение, если вы ее измените. К счастью, вам нужно уйти с дороги, чтобы сделать это, поэтому, если вы делаете это, вероятно, не случайно.
Вы не меняете его, вы его инициализируете. Если бы вы не могли этого сделать, члены-члены были бы бесполезны ... –