• Rust 1.83.0版本发布 快来看下有哪些新特性!
  • 发布于 1个月前
  • 127 热度
    0 评论
  • 顾及谁
  • 24 粉丝 42 篇博客
  •   
Rust团队发布了Rust 1.83.0版本,这个版本对运行在const上下文中的代码所能做的事情进行了几个大的功能扩展。这指的是编译器编译的所有代码必须在编译时求值:const和static设置初始值、数组长度、枚举值、const泛型参数以及可从这些上下文中调用的const函数(const fn)。

Const引用静态量
在以前的版本,除了static可以初始化表达式外,禁止const上下文引用static项。现在这一限制现已解除:
static S: i32 = 25;
const C: &i32 = &S;
但是请注意,在const上下文中仍然不允许读取可变或内部可变的静态变量的值。此外,常量的最终值不能引用任何可变或内部可变的静态变量:
static mut S: i32 = 0;
// 堆代码 duidaima.com
const C1: i32 = unsafe { S };
// error: 常量访问可变全局内存
const C2: &i32 = unsafe { &S };
// error: 对‘const’中可变内存的引用
这些限制确保常量仍然是“常量”:它们计算得到的值,以及它们作为模式(可能涉及解引用)的含义,在整个程序执行过程中都是相同的。然而,允许常量值可以指向可变或内部可变静态变量的原始指针:
static mut S: i32 = 64;
const C: *mut i32 = &raw mut S;
可变引用和指针
现在可以在const上下文中使用可变引用:
const fn inc(x: &mut i32) {
    *x += 1;
}

const C: i32 = {
    let mut c = 41;
    inc(&mut c);
    c
};
还支持可变原始指针和内部可变性:
use std::cell::UnsafeCell;

const C: i32 = {
    let c = UnsafeCell::new(41);
    unsafe { *c.get() += 1 };
    c.into_inner()
};
然而,可变引用和指针只能在常量的内部计算中使用,它们不能成为常量最终值的一部分:
const C: &mut i32 = &mut 4;
// error[E0764]: 可变引用不允许出现在常量的最终值中

这个版本还附带了一整套在const上下文中稳定的新函数。
用户评论