"二进制操作符 `|` 不能用于该类型"

4

我有这个错误

错误:无法将二进制运算符|应用于类型为&mut u16的参数

使用以下代码:

fn f_op(op: &mut u16) {

    let mut addr: u16 = (op | 0xFFF);
    ..//
}

将其更改为&而不是&mut即可解决该问题。

fn f_op(op: & u16) {

但我想知道为什么我不能在 &mut 中使用 |,肯定存在一个很好的原因,但有人能解释一下吗? Play-Rust

由于大多数基本类型(包括u16)都实现了Copy,因此最符合惯例的做法是通过值来获取它们,因为它们将被复制。 - Restioson
2个回答

7

由于BitOr特性未实现适用于&mut u16,但适用于&u16

BitOr trait

正如viraptor指出的那样,您也可以使用以下方法对其进行取消引用:
*op | 0xFFF;

.. 这将使其成为 u16 .. 如您在上方所见,它还实现了 BitOr 特性。


现在我知道使用 * 没有明显的理由来实现,但对于 &mut 可以实现,这只是一个假设性的问题。 - Angel Angel
1
@AngelAngel 嗯,当然,你可以为 &mut 实现它。还有 Box。和 Rc。和 Arc。和 P(在 rustc 中使用)。和 Cell。和 *const。和 *mut。可能还有更多,但你必须在某个点上 停止;最好是最小集合。 - DK.
1
@DK。当然,但是我认为仅为不可变引用实现它相当武断,并且会导致混淆:/ 为原始指针实现它非常不安全。因此,通过对&mut进行实现,BitOr将为所有安全的基本类型实现。 - Lukas Kalbertodt

3
您可能希望对值进行“或”运算,而不是引用。
let mut addr: u16 = *op | 0xFFF;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接