81

関数が RValue Reference を返さなければならない理由はありますか? テクニック、トリック、イディオム、パターン?

MyClass&& func( ... );

私は一般的に参照を返すことの危険性を認識していますが、とにかくそれを行うこともありますよね? T& T::operator=(T)は慣用的な例の 1 つにすぎません。しかし、どうT&& func(...)ですか?それを行うことで得られる一般的な場所はありますか? クライアントコードだけと比べて、ライブラリや API コードを書くときはおそらく違いますか?

4

5 に答える 5

61

適切な場合がいくつかありますが、比較的まれです。このケースは、クライアントがデータ メンバーから移動できるようにする場合の 1 つの例に出てきます。例えば:

template <class Iter>
class move_iterator
{
private:
    Iter i_;
public:
    ...
    value_type&& operator*() const {return std::move(*i_);}
    ...
};
于 2011-04-24T13:54:59.643 に答える
17

これは towi のコメントのフォローアップです。ローカル変数への参照を返したくありません。しかし、あなたはこれを持っているかもしれません:

vector<N> operator+(const vector<N>& x1, const vector<N>& x2) { vector<N> x3 = x1; x3 += x2; return x3; }
vector<N>&& operator+(const vector<N>& x1, vector<N>&& x2)    { x2 += x1; return std::move(x2); }
vector<N>&& operator+(vector<N>&& x1, const vector<N>& x2)    { x1 += x2; return std::move(x1); }
vector<N>&& operator+(vector<N>&& x1, vector<N>&& x2)         { x1 += x2; return std::move(x1); }

これにより、両方のパラメーターが左辺値である場合を除き、すべての場合にコピー (および可能な割り当て) が防止されます。

于 2011-05-02T04:27:15.677 に答える
8

いいえ。値を返すだけです。一般に、参照を返すことはまったく危険ではありません。危険なローカル変数への参照を返すことです。ただし、右辺値参照を返すことは、ほとんどすべての状況でまったく価値がありません (書いているstd::moveか何かであると思います)。

于 2011-04-24T11:34:34.603 に答える
0

もう 1 つの考えられるケース: タプルをアンパックして値を関数に渡す必要がある場合。

この場合、コピー省略についてよくわからない場合に役立ちます。

そのような例:

template<typename ... Args>
class store_args{
    public:
        std::tuple<Args...> args;

        template<typename Functor, size_t ... Indices>
        decltype(auto) apply_helper(Functor &&f, std::integer_sequence<size_t, Indices...>&&){
            return std::move(f(std::forward<Args>(std::get<Indices>(args))...));
        }

        template<typename Functor>
        auto apply(Functor &&f){
            return apply_helper(std::move(f), std::make_index_sequence<sizeof...(Args)>{});
        }
};

std::bindただし、何らかの形式またはstd::thread置換を作成していない限り、かなりまれなケースです。

于 2015-07-28T00:03:06.173 に答える