warning: unused return value of `x` that must be used

使用必須とマークされた値を無視した。

背景情報

must_use 属性をアイテムに付加すると、値の使い忘れを防止してくれる。

アイテムごとの効果

関数
その関数の戻り値について、使い忘れを警告。
その型の全ての値について、使い忘れを警告。
トレイト
そのトレイトを実装する全ての型について、属性の効果を適用。

なお、属性をトレイトの実装側の関数に適用した場合、無視される。
つまり、トレイト側の関数の指定が適用される。

警告のカスタマイズ

警告のメッセージはカスタマイズできる。

サンプル

以下、デフォルトのメッセージによる警告の例。


fn main() {
    must_use();
}

#[must_use]
fn must_use() -> i32 {
    42
}

warning: unused return value of `must_use` that must be used
 --> src\main.rs:2:5
  |
2 |     must_use();
  |     ^^^^^^^^^^
  |
  = note: `#[warn(unused_must_use)]` on by default
help: use `let _ = ...` to ignore the resulting value
  |
2 |     let _ = must_use();
  |     +++++++

備考

制限

全ての使い忘れが警告されるわけではない。

ブロックやタプルなどでラップされると検出できない。

例えば、以下は警告を出力しない。


fn main() {
    { must_use() };
}

#[must_use]
fn must_use() -> i32 {
    42
}

基準

must_use を適用すべきアイテムには以下の特徴がある。

なお、Option::map など、コールバック引数を持つ関数では、たとえ副作用を伴わない用法が多くても、常にそうとは限らないので、対象外とする傾向がある。

std の状況

、上記の基準から外れたものも多い。
また、同系統のアイテムについての一貫性もない。

調査結果

いくつかピックアップした調査結果…。

コンストラクタ系

以下はどれも副作用なしのため、全て must_use が期待される。

Box::new
Vec::new
Rc::new ×
ゲッター系

以下はどれも副作用なしのため、全て must_use が期待される。

slice::len
slice::is_empty
Vec::len ×
Vec::is_empty ×
Weak::strong_count
Weak::weak_count
Rc::strong_count ×
Rc::weak_count ×
コールバック系

以下はどれもコールバックを伴うため、全て must_use なしが期待される。

Option::map ×
Option::is_some_and
その他

以下は副作用なしだが must_use なし。

Result::ok ×
Result::err ×