LLVM/Clangでは、戻り値最適化(RVO; return value optimization)を阻害する/単に冗長なstd::move
関数利用を警告するオプションが提供される。
Clang 3.7で追加された警告オプション。両オプションとも -Wall オプション指定に含まれるため、個別に指定するケースは少ないはず。
Improvements to Clang's diagnostics
http://llvm.org/releases/3.7.0/tools/clang/docs/ReleaseNotes.html
- (snip)
- -Wredundant-move warns when a parameter variable is moved on return and the return type is the same as the variable. Returning the variable directly will already make a move, so the call is not needed.
- -Wpessimizing-move warns when a local variable is moved on return and the return type is the same as the variable. Copy elision cannot take place with a move, but can take place if the variable is returned directly.
- (snip)
- -Wpessimizing-move:copy elision最適化を阻害する
std::move
呼び出しを警告する。余計なムーブコンストラクタ呼び出しを避けるため、std::move
呼び出しを削除することが望ましい。 - -Wredundant-move:単に冗長な
std::move
呼び出しを警告する。copy elision基準を満たさないため(→id:yohhoy:20120808)、std::move
の明示有無によらずムーブコンストラクタは呼び出される。
struct X {}; X make_X() { return {}; } X f() { X v1 = std::move(make_X()); // "X v1 = make_X();"が望ましい // warning: moving a temporary object prevents copy elision [-Wpessimizing-move] return std::move(v1); // "return v1;"が望ましい // warning: moving a local object in a return statement prevents copy elision [-Wpessimizing-move] } X h(X a1) { return std::move(a1); // "return a1;"と同義 // warning: redundant move in return statement [-Wredundant-move] }
関連URL