常量求值

常量求值是在编译期间计算表达式结果的过程。只有所有表达式的子集可以在编译时求值。

常量表达式

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

常量上下文中,这些是唯一允许的表达式,并且总是会在编译时求值。

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

如果值必须在编译时求值(即在常量上下文中),则越界数组索引溢出等行为是编译器错误。否则,这些行为是警告,但很可能在运行时 panic。

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

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

这些要求仅在常量被求值时检查。换句话说,只要这些访问永远不会被执行,那么在常量上下文中语法上出现这些访问是被允许的。

  • 所有形式的借用,包括原始借用,但有一个限制:可变借用和对具有内部可变性的值进行共享借用仅允许引用瞬态位置。如果一个位置的生命周期严格包含在当前的常量上下文内,则该位置是瞬态的。
  • 类型转换表达式,除了
    • 指针到地址的转换,以及
    • 函数指针到地址的转换。

常量上下文

常量上下文是以下之一

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

Const 函数

const fn 是允许从常量上下文调用的函数。

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

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