AUTOSAR C++14 Rule A18-9-2
Forwarding values to other functions shall be done via:(1) std::move if the value is an rvalue reference, (2) std::forward if the value is forwarding reference
説明
ルール定義
Forwarding values to other functions shall be done via:(1) std::move if the value is an rvalue reference, (2) std::forward if the value is forwarding reference.
根拠
オブジェクトを rvalue にキャストし、移動セマンティクスを利用することによって、オブジェクトを効率的に関数に渡すことができます。
rvalue 参照を関数に転送する場合は、
std::moveを使用してオブジェクトを右辺値にキャストします。転送参照 (またはユニバーサル参照) を関数に転送する場合は、オブジェクトが rvalue に制限される場合にのみ、
std::forwardを使用してオブジェクトを右辺値にキャストします。転送参照は、rvalue または lvalue に制限される可能性があります。このルールのため、auto &&型のオブジェクトは転送参照と見なされます。
std::move と転送参照を使用すると、lvalue が予期せず変更される可能性があります。std::forward と rvalue 参照を使用できますが、ミスが発生しやすく、コードが複雑になる可能性があります。
Polyspace 実装
Polyspace® は、
auto &&型のオブジェクトを含む、転送参照を関数に転送するためのstd::moveの使用にフラグを設定します。Polyspace は、rvalue 参照を関数に転送するための
std::forwardの使用にフラグを設定します。Polyspace は、関数への転送が実行されない場合は、
std::moveまたはstd::forwardの使用にフラグを設定しません。たとえば、このコード スニペットでは、std::moveと転送参照b2の使用時とstd::forwardと右辺値参照b1の使用時に欠陥が発生しません。template <typename T1, typename T2> void func(T1& b1, T2&& b2) { const T1& b10 = std::forward<B>(b1); const T2& b20 = std::forward<B>(b2); const T1& b11 = std::move(b1); const T2& b21 = std::move(b2); }
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 言語サポート ライブラリ |
| カテゴリ: Required、Automated |
バージョン履歴
R2020b で導入