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

Gum*_*Gun 2 unsafe rust

我在一些我认为应该有效的事情中遇到了一些编译错误:

fn function() -> bool {
    unsafe { 1 } == 1
}
Run Code Online (Sandbox Code Playgroud)
fn function() -> bool {
    unsafe { 1 } == 1
}
Run Code Online (Sandbox Code Playgroud)

我知道这有点无用,但这1确实是一个不安全的功能。但这样就可以了。

fn function() -> bool {
    let var = unsafe { 1 };
    var == 1
}
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*man 5

问题是这unsafe是一种块表达式,因此当它出现在语句开头时我们可以省略末尾的分号,但这意味着它被解析为整个语句,我们不能将其用作表达式的一部分。参考文献中提到了这一点

仅由块表达式或控制流表达式组成的表达式,如果在允许语句的上下文中使用,则可以省略尾随分号。这可能会导致它被解析为独立语句和另一个表达式的一部分之间的歧义;在这种情况下,它被解析为语句。

解决方法是将其括在括号中:

fn function() -> bool {
    (unsafe { 1 }) == 1
}
Run Code Online (Sandbox Code Playgroud)