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