error[E0515]: cannot return reference to local variable `var`

error[E0515]: cannot return value referencing local variable `var`

error[E0515]: cannot return reference to function parameter `arg`

error[E0515]: cannot return value referencing function parameter `arg`

error[E0515]: cannot return reference to temporary value

error[E0515]: cannot return value referencing temporary value

関数が参照型を戻す場合、参照先は関数からの復帰後も有効でなければならない。

そのため、ローカル変数、関数の引数、一時値、これらは戻り値に包含できない。

パターン

パターン A1

戻り値がローカル変数への参照

以下では、戻り値がローカル変数への参照である。


fn test() -> &'static i32 {
    let var = 0;
    &var
}

error[E0515]: cannot return reference to local variable `var`
 --> src\lib.rs:3:5
  |
3 |     &var
  |     ^^^^ returns a reference to data owned by the current function

パターン A2

戻り値がローカル変数への参照を包含

以下では、戻り値がローカル変数への参照を包含している。


fn test() -> Box<&'static i32> {
    let var = 0;
    Box::new(&var)
}

error[E0515]: cannot return value referencing local variable `var`
 --> src\lib.rs:3:5
  |
3 |     Box::new(&var)
  |     ^^^^^^^^^----^
  |     |        |
  |     |        `var` is borrowed here
  |     returns a value referencing data owned by the current function

パターン B1

戻り値が引数への参照

以下では、戻り値が引数への参照である。


fn test(arg: i32) -> &'static i32 {
    &arg
}

error[E0515]: cannot return reference to function parameter `arg`
 --> src\lib.rs:2:5
  |
2 |     &arg
  |     ^^^^ returns a reference to data owned by the current function

パターン B2

戻り値が引数への参照を包含

以下では、戻り値が引数への参照を包含している。


fn test(arg: i32) -> Box<&'static i32> {
    Box::new(&arg)
}

error[E0515]: cannot return value referencing function parameter `arg`
 --> src\lib.rs:2:5
  |
2 |     Box::new(&arg)
  |     ^^^^^^^^^----^
  |     |        |
  |     |        `arg` is borrowed here
  |     returns a value referencing data owned by the current function

パターン C1

戻り値が一時値への参照

以下では、戻り値に一時値への参照である。


fn test(arg: i32) -> &'static i32 {
    &(arg + 1)
}

error[E0515]: cannot return reference to temporary value
 --> src\lib.rs:2:5
  |
2 |     &(arg + 1)
  |     ^---------
  |     ||
  |     |temporary value created here
  |     returns a reference to data owned by the current function

パターン C2

戻り値が一時値への参照を包含

以下では、戻り値が一時値への参照を包含している。


fn test(arg: i32) -> Box<&'static i32> {
    Box::new(&(arg + 1))
}

error[E0515]: cannot return value referencing temporary value
 --> src\lib.rs:2:5
  |
2 |     Box::new(&(arg + 1))
  |     ^^^^^^^^^^---------^
  |     |         |
  |     |         temporary value created here
  |     returns a value referencing data owned by the current function