相当于来自C++的constexpr?

Fre*_*ios 13 rust

看到这段代码:

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

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
   |               ^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

它在Rust的C++ constexpr机制中是等价的吗?

Mat*_* M. 14

constexpr 在C++中可以用于两种不同的情况:

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

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

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

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

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

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

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

  • @AleksanderFular:自从我经过...... [MIRI](https://github.com/solson/miri)项目后,由Rustc使用的MIR中级中级代表的翻译器已经降落在rustc中,并且已经1.24已经将一些函数稳定为`const`,例如`mem :: size_of`. (3认同)
  • @AleksanderFular:正在开发一个名为[miri](https://github.com/solson/miri)(又称MIR解释器)的功能强大的常量评估器。目前,Rust社区大多数人都满足于“等待它”并观看solson和oli-obk实验,看看有什么可能,什么不是,什么代价太高,有哪些陷阱等……请注意,MIRI明显更多比C ++的constexpr先进:它处理内存分配! (2认同)
  • @Nawaz:你可以(每晚),你只需要证明没有溢出。这是尽可能避免单态化错误的决定的后果。大多数时候,简单的算术就足够了;这只是递归的问题,因为“证明”的数量是无限的。 (2认同)