| A mutable reference was used in a constant. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0764 |
| fn main() { |
| const OH_NO: &'static mut usize = &mut 1; // error! |
| } |
| ``` |
| |
| Mutable references (`&mut`) can only be used in constant functions, not statics |
| or constants. This limitation exists to prevent the creation of constants that |
| have a mutable reference in their final value. If you had a constant of |
| `&mut i32` type, you could modify the value through that reference, making the |
| constant essentially mutable. |
| |
| While there could be a more fine-grained scheme in the future that allows |
| mutable references if they are not "leaked" to the final value, a more |
| conservative approach was chosen for now. `const fn` do not have this problem, |
| as the borrow checker will prevent the `const fn` from returning new mutable |
| references. |
| |
| Remember: you cannot use a function call inside a constant or static. However, |
| you can totally use it in constant functions: |
| |
| ``` |
| const fn foo(x: usize) -> usize { |
| let mut y = 1; |
| let z = &mut y; |
| *z += x; |
| y |
| } |
| |
| fn main() { |
| const FOO: usize = foo(10); // ok! |
| } |
| ``` |