相当于来自C ++的constexpr?

时间:2016-12-27 13:57:02

标签: rust

请参阅此代码:

fn main() {
    let something_const = 42;
    fn multiply(nbr: i32) -> i32 {
        nbr * something_const
    }
    println!("{}", multiply(1));
}

rustc输出

error[E0434]: can't capture dynamic environment in a fn item; use the || { ... } closure form instead
  --> main.rs:19:15
   |
19 |         nbr * something_const
   |               ^^^^^^^^^^^^^^^

但是something_const不是动态的,因为它在编译时是已知的。

它是否与Rust的C ++ constexpr机制相同?

1 个答案:

答案 0 :(得分:12)

C ++中的

constexpr可用于两种不同的情况:

  • 用于限定常量,并表示此常量必须在编译时可用
  • 用于限定函数,并表示此函数必须可用于编译时评估

Rust支持两者,尽管是有限的方式:

  • 您可以使用const声明一个常量而不是let来声明它是真正的常量
  • 每晚,你可以使用const来限定一个函数,声明它可以在编译时进行评估

在您的情况下,您需要第一次使用:

fn main() {
    const something_const: i32 = 42;
    fn multiply(nbr: i32) -> i32 {
        nbr * something_const
    }
    println!("{}", multiply(1));
}

请注意,与let不同,必须使用其类型注释常量。

此外,编译器会抱怨命名;常量使用ALL_CAPS