常量求值
常量求值是在编译期间计算表达式结果的过程。只有所有表达式的子集可以在编译时求值。
常量表达式
某些形式的表达式,称为常量表达式,可以在编译时求值。
在常量上下文中,这些是唯一允许的表达式,并且总是会在编译时求值。
在其他地方,例如let 语句中,常量表达式可能会在编译时求值,但不能保证。
如果值必须在编译时求值(即在常量上下文中),则越界数组索引或溢出等行为是编译器错误。否则,这些行为是警告,但很可能在运行时 panic。
以下表达式是常量表达式,只要任何操作数也是常量表达式,并且不会导致运行任何 Drop::drop
调用。
- 字面量.
- 常量参数.
- 指向静态变量的路径,具有以下限制
- 在任何常量求值上下文中都不允许写入
static
项。 - 在任何常量求值上下文中都不允许从
extern
静态变量读取。 - 如果求值不是在
static
项的初始化器中执行的,则不允许从任何可变static
读取。可变static
是static mut
项,或具有内部可变类型的static
项。
- 在任何常量求值上下文中都不允许写入
这些要求仅在常量被求值时检查。换句话说,只要这些访问永远不会被执行,那么在常量上下文中语法上出现这些访问是被允许的。
- 结构体表达式。
- 字段表达式。
- 不从环境中捕获变量的闭包表达式。
- 解引用运算符,原始指针除外。
- 分组表达式。
- 类型转换表达式,除了
- 指针到地址的转换,以及
- 函数指针到地址的转换。
- const 函数和 const 方法的调用。
常量上下文
常量上下文是以下之一
用作类型一部分的常量上下文(数组类型和重复长度表达式以及 const 泛型参数)只能限制性地使用周围的泛型参数:这样的表达式必须是单个裸 const 泛型参数,或者是不使用任何泛型参数的任意表达式。
Const 函数
const fn 是允许从常量上下文调用的函数。
声明函数为 const
对任何现有用法都没有影响,它只会限制参数和返回类型可能使用的类型,并将函数体限制为常量表达式。
当从常量上下文调用时,函数由编译器在编译时解释。解释发生在编译目标的环境中,而不是主机环境中。因此,如果您针对 32
位系统进行编译,则 usize
为 32
位,这与您是在 64
位系统还是 32
位系统上构建无关。