Rust编写泛型维度邻接结构体触发const_evaluatable_unchecked警告如何解决
问题原因
你遇到的警告是由于使用了Rust仍处于实验阶段的generic_const_exprs特性导致的。该特性目前对「依赖const泛型参数的常量表达式在类型系统中的合法性校验」逻辑还未完全定型,编译器当前无法自动推导你指定了固定维度D=1的impl块中size(D)的求值合法性,因此抛出了该过渡性警告。
解决方法
你只需要在固定维度的impl块上显式添加对应的const表达式合法性约束即可消除警告,修改后的impl块写法如下:
#[allow(unused)] impl<T> Adjacents<T, 1u32> where [(); size(1)]:, { pub const LEFT: usize = 0; pub const CENTER: usize = 1; pub const RIGHT: usize = 2; }
同样的,你针对Adjacents<Option<T>, 1u32>的Border trait实现也需要加上相同的约束:
impl<T: Border<1u32>> Border<1u32> for Adjacents<Option<T>, 1u32> where [(); size(1)]:, { // 原有实现保持不变 }
如果不想每个固定维度的impl都重复写约束,也可以直接在全局添加#![allow(const_evaluatable_unchecked)]来屏蔽该类警告,但更推荐上面显式加约束的写法,更符合未来该特性稳定后的语法规范。
额外说明
你当前的写法逻辑本身没有问题,只是因为使用了不稳定特性才触发了过渡警告,等generic_const_exprs特性正式稳定后,这类固定参数的const表达式校验逻辑会被编译器自动处理,不需要额外加约束。
内容的提问来源于stack exchange,提问作者Jonathan Woollett-light
相关产品推荐
相关产品推荐

