非標準だと思う次のイディオムを使用したいと思います。戻り値の最適化を利用してベクトルを返す関数があります。
vector<T> some_func()
{
...
return vector<T>( /* something */ );
}
次に、私は使用したいと思います
vector<T>& some_reference;
std::swap(some_reference, some_func());
some_func
LValue を返しません。上記のコードは理にかなっており、このイディオムは非常に便利であることがわかりました。ただし、規格外です。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
。