私は他のライブラリから多くの関数とメソッドをラップするライブラリを書いています。戻り値の対処を避けるために、私は次のstd::forward
ように適用しています:
template<class T>
T&& wrapper(T&& t) {
f(t); // t passed as lvalue
return std::forward<T>(t);
}
f
返しvoid
て取るT&&
(または価値をオーバーロードする)。ラッパーは常にラッパーのパラメーターを返し、戻り値では引数の値を保持する必要があります。実際に使用する必要がありstd::forward
ますreturn
か? RVOはそれを不要にしますか?それが参照 (R または L) であるという事実は、それを不必要にしますか? return が最後の関数ステートメントではない場合 (if 内) は必要ですか?
呼び出し元は arg (参照、R または L) を介して評価された値にアクセスできるため、またはwrapper()
を返す必要があるかどうかは議論の余地があります。しかし、私の場合、式で使用できるように値を返す必要があります。void
T&&
wrapper()
質問とは無関係かもしれませんが、関数f
は から盗まないことが知られているため、 int
の最初の使用は不要であり、私によって削除されました。std::forward
f(std::forward<T>(t))
私は小さなテストを書きました: https://gist.github.com/3910503
テストでは、転送されずに返されることT
が示されています - -O3 を使用して gcc48 と clang32 に追加のコピーを作成します (RVO は起動しません)。
また、次の UB から悪い動作を取得できませんでした。
auto&& tmp = wrapper(42);
未定義の動作であるため (UB の場合)、何の原因も証明されません。