可以检查一个值是 Rust 中的编译时常量吗?

ide*_*n42 4 macros rust

在某些情况下,内联函数或宏会扩展为大量代码。但是,当与常量一起使用时,可以优化掉死分支。

我可以在代码中添加注释:

// foo arg is always a constant, dead branches will be removed
Run Code Online (Sandbox Code Playgroud)

但我宁愿添加某种静态断言以确保始终如此。

Rust 有没有办法检查一个值是否是编译时常量?

像 GCC 的东西__builtin_constant_p

Fra*_*gné 5

如果值或表达式的类型是固定的并且事先已知,则可以定义一个局部常量并用该值或表达式对其进行初始化。如果不以其他方式使用常量,请在其名称前加上下划线以抑制有关常量未使用的编译器警告。不过,这只适用于宏。

const _ASSERT_COMPILE_TIME_CONSTANT: i32 = $arg;
Run Code Online (Sandbox Code Playgroud)

nightly 编译器还支持定义“const 函数”,即可以在编译器需要可以在编译时计算的表达式的上下文中使用的函数。这些函数的主体受到限制,但是不需要在编译时求值的 const 函数的调用点可以将无法在编译时求值的表达式作为参数传递,因此定义一个 const 函数不提供保证你要求。


如果不能在宏中指定值或表达式的类型,那么我们不能省略它,因为const需要指定类型。但是,我们可以使用在const初始化程序中返回固定类型的通用 const 函数!

// at the beginning of the crate
#![feature(const_fn)]

// in the macro's body
const fn _swallow<T>(_x: T) { () }
const _ASSERT_COMPILE_TIME_CONSTANT: () = _swallow($arg);
Run Code Online (Sandbox Code Playgroud)