常量求值

常量求值是在编译期间计算表达式结果的过程。只有全部表达式的一个子集可以在编译期间被求值。

常量表达式

某些形式的表达式,被称为常量表达式,可以在编译期间被求值。

const 上下文中,这些是唯一允许的表达式,并且总是在编译期间被求值。

在其他地方,例如let 语句中,常量表达式可能在编译期间被求值,但不保证如此。

诸如数组索引越界或溢出等行为,如果该值必须在编译期间被求值 (即在 const 上下文 中),会导致编译器错误。否则,这些行为会产生警告,但在运行时很可能会 panic。

以下表达式是常量表达式,只要任何操作数也都是常量表达式,且不会导致任何Drop::drop调用被运行。

  • 指向静态项的路径,具有以下限制
    • 在任何常量求值上下文中,不允许对static项进行写入。
    • 在任何常量求值上下文中,不允许从extern静态项进行读取。
    • 如果求值不是static项的初始化器中执行的,那么不允许从任何可变的static项进行读取。可变的static项是指static mut项,或者一个具有内部可变类型的static项。

这些要求只在常量被求值时检查。换句话说,允许此类访问在语法上出现在 const 上下文 中,只要它们永远不会被执行。

  • 所有形式的借用,包括裸借用,但有一个限制:对具有内部可变性的值的可变借用和共享借用只允许引用瞬态位置。一个位置是瞬态的,如果其生命周期严格包含在当前的const 上下文之内。
  • 转换 (cast) 表达式,但以下情况除外:
    • 指针到地址的转换,以及
    • 函数指针到地址的转换。

Const 上下文

一个const 上下文 是以下之一

用作类型一部分的 const 上下文(数组类型和重复长度表达式以及 const 泛型参数)只能有限地使用其周围的泛型参数:此类表达式必须是单个裸露的 const 泛型参数,或是一个不使用任何泛型的任意表达式。

Const 函数

一个const fn 是一个允许从 const 上下文 调用的函数。

将函数声明为 const 对任何现有用法没有影响,它只限制参数和返回类型可以使用的类型,并且将函数体限制为常量表达式。

当从 const 上下文 调用时,函数在编译期间由编译器解释。解释发生在编译目标的环境中,而不是主机环境。因此,如果针对 32 位系统进行编译,usize 就是 32 位,这与您是在 64 位还是 32 位系统上构建无关。