コピーと移動の両方をサポートする必要がある別のパラメトリック クラスを埋め込むクラスがあるとします。そして、特定の状況で、何らかの方法で内部値を取得する必要があると仮定しましょう。
典型的なアプローチは次のとおりです。
template<class T>
class wrapper
{
public:
wrapper() :val() {}
wrapper(T s) :val(std::move(s)) {}
wrapper(const wrapper& s) :val(s.val) {}
wrapper(wrapper&& s) :val(std::move(s.val)) {}
wrapper& operator=(wrapper s) { val = std::move(s.val); return *this; }
T value() const { return val; }
private:
T val;
};
それを行う唯一の方法ではありません。コピーと移動を説明する必要はないかもしれませんが、そのままにしておいてください。
要点は別です。特定のインスタンスでは、それ自体が copy/movable class であるとしますT
。もちろん、wrapper::value()
T のコピーを返します。
ここで、返された T をパラメーターとして別の呼び出しに渡す必要があり、含まれているラッパーが一時的なものであるとします。
より簡単なシミュレーションは、
calledfn(wrapper<T>(someT).value());
繰り返しますが、この方法で行うのは無知ですが、より複雑なケースでは、この些細なケースが機能する必要があります。
理論的には、一時的なラッパーから離れて呼び出し元に渡すことを認めることができますが、一時的な場合はバインドされ、一時的でない場合はバインドされないようval
に、どの署名にvalue()
メソッドが必要ですか。優先されますか?wrapper<T>
value() const