は、次の例を考えてみましょう:stringstreamの.str()メンバーを移動することはできますか?
#include <sstream>
template <typename T>
inline std::string to_string(T const & op) {
std::ostringstream result;
result << op;
return result.str();
}
私が代わりにresult.str()の、結果を返すようにした場合は、自動的に右辺値になります。そうではない結果に含まれる文字列(私は仮定します)。私はそれがコピーされ、そのコピーが右辺値として返されることを期待しています。
だからここに私の質問は、それが法的にある:私はそれが有効な、空の文字列が残さするストリームを期待していると仮定します
return std::move(result.str());
。しかし、私は実際にそれを行うのに十分な確信を持っていません。
returnステートメントで 'std :: move(e)'を呼び出すのは反パターンです。返された式は、とにかくrvalueとして暗黙的に扱われ、 'std :: move'を使うとコピー・エリジョンが禁止されます。 – TartanLlama
@TartanLlamaあなたはあまり単純化していませんか? "std :: string std :: ostringstream :: str()&&"という関数があった場合、関数を "return std :: move(result).str();"のままにする最良の方法ではないでしょうか? – kamikaze
@kamikazeええと、バウムは私があなたのリターンステートメントにある全てのパターンを 'std :: move(e)'としていると言っています。ここで 'e'はある表現です。 – TartanLlama