0

非標準だと思う次のイディオムを使用したいと思います。戻り値の最適化を利用してベクトルを返す関数があります。

vector<T> some_func()
{
    ...
    return vector<T>( /* something */ );
}

次に、私は使用したいと思います

vector<T>& some_reference;
std::swap(some_reference, some_func());

some_funcLValue を返しません。上記のコードは理にかなっており、このイディオムは非常に便利であることがわかりました。ただし、規格外です。VC8 は最高の警告レベルでのみ警告を発しますが、他のコンパイラはそれを拒否するのではないかと思います。

私の質問は:私がやりたいのとまったく同じことを達成する方法はありますか(つまり、ベクトルを構築し、別のベクトルに代入し、古いものを破棄します)、準拠しています(代入演算子を使用しません。以下を参照) ?

私が書いたクラスでは、通常、代入を次のように実装します。

class T
{
    T(T const&);
    void swap(T&);
    T& operator=(T x) { this->swap(x); return *this; }
};

コピー省略を利用して、私の問題を解決します。ただし、標準タイプの場合swapは、一時的な無駄なコピーが必要ないため、本当に使用したいと思います。

また、VC8 を使用して標準 C++ を生成する必要があるため、C++0x とその右辺値参照について聞きたくありません。

編集:最後に、私は思いついた

typedef <typename T>
void assign(T &x, T y)
{
    std::swap(x, y);
}

左辺値を使用する場合、y が一時的な場合、コンパイラはコピー コンストラクターへの呼び出しを自由に最適化し、左辺値がある場合に使用するためstd::swapです。私が使用するすべてのクラスは、 の愚かでないバージョンを実装するために「必要」ですstd::swap

4

3 に答える 3

1

はクラス型であるためstd::vector、メンバー関数は右辺値で呼び出すことができます。

some_func().swap(some_reference);
于 2010-07-08T20:40:17.060 に答える
1

一時ファイルの無用なコピーが必要ない場合は、値で返さないでください。(共有) ポインターを使用し、参照によって関数引数を渡して入力し、反復子を挿入します。

値で返したい特定の理由はありますか?

于 2010-07-08T16:43:18.353 に答える
0

私が知っている - 標準の制約内で - あなたが望むものを達成するための唯一の方法は、式テンプレートのメタプログラミング技術適用することです:

于 2010-07-08T16:54:41.053 に答える