我想定义一个类似于
pub struct ArInt<const W: usize, const S: bool>
{
iarr : [i32; {(W + 31 + (!S))/32}],
}
我得到一个编译错误:
--> src/ar_int.rs:7:27
|
7 | iarr : [i32; {(W + 31 + (!S))/32}],
| ^ no implementation for `usize + bool`
|
= help: the trait `Add<bool>` is not implemented for `usize`
= help: the following other types implement trait `Add<Rhs>`:
<&'a usize as Add<usize>>
<&usize as Add<&usize>>
<usize as Add<&usize>>
<usize as Add>
我做了如下修改
pub struct ArInt<const W: usize, const S: bool>
{
iarr : [i32; {(W + 31 + (!S) as usize)/32}],
}
我仍然得到一个错误:
error: unconstrained generic constant
--> src/ar_int.rs:7:12
|
7 | iarr : [i32; {(W + 31 + (!S) as usize)/32}],
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: try adding a `where` bound using this expression: `where [(); {(W + 31 + (!S) as usize)/32}]:`
有办法让它工作吗?
PS:我有#![feature(generic_const_exprs)]
谢谢
**更新:**如@Caesar所述,按照编译器给出的提示即可。
pub struct ArInt<const W: usize, const S: bool>
where [(); {(W + 31 + (!S) as usize)/32}]:
{
iarr : [i32; {(W + 31 + (!S) as usize)/32}],
}
但谁能解释一下“where”这句话的意思?看起来很奇怪
谢谢
1条答案
按热度按时间58wvjzkj1#
在本文中,
where [(); {(W + 31 + (!S) as usize)/32}]:
表示或多或少:“* 其中[(); {(W + 31 + (!S) as usize)/32}]
是可能的类型 *"。这使得允许的值从一开始就很清楚。例如,你不能这样做:因为
usize::MAX + 31
会溢出。where
子句使该约束可见,而无需查看实现细节。