我可以在 Rust 中将 const 与重载运算符一起使用吗?

2024-05-02

在此代码中:

#![allow(dead_code)]
use std::ops::Add;
struct Foo(i32);

const X: i32 = 1;
const Y: i32 = X + X;
const A: Foo = Foo(1);
const B: Foo = A + A;

impl Add for Foo {
    type Output = Foo;
    fn add(self, rhs: Foo) -> Foo {
        Foo(self.0 + rhs.0)
    }
}

编译器说:

error[E0015]: calls in constants are limited to struct and enum constructors
 --> src/main.rs:8:16
  |
8 | const B: Foo = A + A;
  |                ^^^^^
  |
note: a limited form of compile-time function evaluation is available on a nightly compiler via `const fn`
 --> src/main.rs:8:16
  |
8 | const B: Foo = A + A;
  |                ^^^^^

最好的替代是什么?


你不能。即,实施add从字面上可以做到anythingRust 可以做的事情,包括恐慌、打印输出、读取文件、分配内存等。

您需要“手动”构建常量:

const B: Foo = Foo(2);

您还可以利用构建脚本 http://doc.crates.io/build-script.html这将生成 Rust 代码,然后您可以将其包含回您的程序中。


正如错误消息所说:

注意:夜间编译器可以通过以下方式获得有限形式的编译时函数评估const fn

然而,这对你现在没有帮助,因为目前无法制作特征方法const,我怀疑Add::add(或任何其他操作员特征)将被标记const因为这会过于限制——阻止实施Add使用上面列出的所有功能。我不知道专业化/子类型如何与 const 函数一起使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 Rust 中将 const 与重载运算符一起使用吗? 的相关文章

随机推荐