Константы в C ++ и Rust принципиально разные. В C ++ constness это свойство любого типа, а в Rust это свойство ссылки. Таким образом, в Rust нет истинных константных типов.
Возьмем, к примеру, этот код C ++:
void test() {
const std::string x;
const std::string *p = &x;
const std::string &r = x;
}
Переменная x
объявлена с типом константы, поэтому любая ссылка, созданная на нее, будет быть также постоянным, и любая попытка изменить его (с помощью const_cast
для экзамена) приведет к неопределенному поведению . Обратите внимание, что const
является частью типа объекта.
Однако в Rust нет способа объявить постоянную переменную:
fn test() {
let x = String::new();
let r = &x;
let mut x = x; //moved, not copied, now it is mutable!
let r = &mut x;
}
Здесь константность или взаимность не является частью типа переменной, а свойством каждой ссылки. И даже оригинальное имя переменной можно считать ссылкой.
Потому что, когда вы объявляете локальную переменную, в C ++ или Rust, вы на самом деле делаете две вещи:
- Создание самого объекта.
- Объявление имени для доступа к объекту, ссылка своего рода.
Когда вы пишете константу C ++, вы делаете обе константы Объект и ссылка. Но в Rust нет постоянных объектов, поэтому только ссылка постоянна. Если вы перемещаете объект, вы удаляете исходное имя и связываете его с новым, которое может изменяться или не изменяться.
Обратите внимание, что в C ++ нельзя перемещать постоянный объект, он останется постоянным навсегда. Но в
о наличии двух consts
для указателей, они одинаковы в Rust, если у вас есть два косвенных направления:
fn test() {
let mut x = String::new();
let p: &mut String = &mut x;
let p2: &&mut String = &p;
}
О том, что лучше, это вопрос попробовать, но запомнить все странные вещи, которые константа может делать в C ++:
- Постоянный объект всегда постоянен, кроме случаев, когда это не так: конструкторы и деструкторы.
- Константа класс с изменяемыми членами не является действительно постоянным.
mutable
не является частью системы типов, в то время как Rust Cell/RefCell
. - Класс с константным членом - трудная задача: конструкторы по умолчанию и операторы копирования / перемещения не работают.