为什么Rust中的const函数不能调用关联函数?

9
这个:
const fn pow2(exp: u32) -> u32 {
    u32::pow(exp, 2)
}

编译器报错:

error[E0015]: calls in constant functions are limited to constant functions, struct and enum constructors

有没有一种方法可以做到这一点?我想要做的是:
pub const MY_BITMASK: u32 = pow2(4);

3
因为 pow 不是常数? - Stargateur
1
Rust中没有“static fn”这样的概念,只有“const fn”。 - Shepmaster
@Shepmaster 在一些文献中,我看到Thing::method()被称为“静态方法”,例如https://rustbyexample.com/fn/methods.html - marathon
1
@marathon 谢谢你指出这一点。它们被称为关联函数。我会考虑提交一个PR来修复它。 - Shepmaster
1个回答

18

常量函数不能调用非常量函数。这是因为常量函数需要在编译期间运行,所以它们不能调用只能在运行时评估的非常量函数。由于u32::pow不是常量函数,因此无法从常量函数中调用它。

现在的问题是:为什么u32::pow不是常量函数?原因是常量函数的当前限制:它们只能包含语言的子集。特别是,它们不能包含循环或赋值。由于u32::pow使用了这两个, 它不能被标记为const,因此不能从常量函数中调用。

请注意,没有任何限制可以从常量函数中调用关联函数,只要关联函数标记为const即可。而u32::pow在任何情况下都不是关联函数:您可以像x.pow(y)一样调用它。

更新:在Rust 1.46中,常量函数得到了更多的语言特性,它们可以使用ifwhile&&等等。而整数类型的pow函数在Rust 1.50中也被改为了const


更新:希望随着 Miri 被更多地集成到 rustc 中,将有更多的事情变得可能,并且许多其他函数将能够被标记为 const - Isaac Woods

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接