恒定"f"表达式的相关常数

Jen*_*ens 5 rust associated-const

我试图使用关联常量作为if-expression中的条件来初始化另一个常量.我认为这应该工作,因为我可以直接使用关联的常量初始化一些其他常量,因此它适用于const上下文并且if表达式不依赖于任何其他值.

trait C {
    const c: i32;
}

trait StaticAssert<T1: C, T2: C> {
    const canUseAssociatedConst: i32 = T1::c;
    const canCompareAssociatedConst: bool = T1::c == T2::c;

    const check: i32 = if T1::c == T2::c { 1 } else { 0 };
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我收到一个错误:

error[E0019]: constant contains unimplemented expression type
 --> src/lib.rs:9:24
  |
9 |     const check: i32 = if T1::c == T2::c { 1 } else { 0 };
  |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我不确定编译器想告诉我什么.我添加了i32后缀以强制文字实际上是i32值,以防止分支中不同类型的任何问题,但这也没有帮助.

phi*_*mue 5

据我所知,if其他人在const上下文中尚未受到支持.

但是,通常您可以按照以下方式获得类似的效果:

trait C {
    const c: i32;        
}

trait StaticAssert<T1:C, T2:C> {
    const canUseAssociatedConst: i32 = T1::c;
    const canCompareAssociatedConst: bool = T1::c == T2::c;

    const check: i32 = (T1::c == T2::c) as i32;
}
Run Code Online (Sandbox Code Playgroud)

  • @Jens一个稍微更普遍的hack是使用`[expr1,expr2] [condition as usize]`来根据条件在两个const表达式之间进行选择. (6认同)