rust 为什么unsafe { x } == y不能编译?

hpcdzsge  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(62)

我得到一些编译错误的东西,我相信它应该工作:

fn function() -> bool {
    unsafe { 1 } == 1
}
error: expected expression, found `==`
 --> src/main.rs:9:18
  |
9 |     unsafe { 1 } == 1
  |                  ^^ expected expression

error[E0308]: mismatched types
 --> src/main.rs:9:14
  |
9 |     unsafe { 1 } == 1
  |              ^ expected `()`, found integer

For more information about this error, try `rustc --explain E0308`.
error: could not compile `testcon` due to 2 previous errors

我知道这有点没用,但是1确实是一个不安全的函数。不过,这样就行了。

fn function() -> bool {
    let var = unsafe { 1 };
    var == 1
}

我知道也许两者都将被优化为完全相同,但我很好奇为什么

b1zrtrql

b1zrtrql1#

问题是unsafe是一种块表达式,所以当它出现在语句的开头时,我们可以省略末尾的后缀,但这意味着它被解析为整个语句,我们不能将其作为表达式的一部分使用。参考文献中提到:
仅由block expression或控制流表达式组成的表达式,如果在允许语句的上下文中使用,则可以省略尾随字符。这可能会导致在将其解析为独立语句和作为另一个表达式的一部分之间产生歧义;在本例中,它被解析为语句。
修复方法是将其括在括号中:

fn function() -> bool {
    (unsafe { 1 }) == 1
}

相关问题