1
如何用operator+
實現移動語義的正確方法?類似於std::string
的工作方式?運算符+和移動語義
我曾嘗試以下,但我希望有一些更優雅,更可能是正確的方式做到這一點:
class path
{
std::vector<std::string> path_;
public:
path& path::operator+=(const path& other)
{
path_.insert(std::begin(path_), std::begin(other.path_), std::end(other.path_));
return *this;
}
path& path::operator+=(path&& other)
{
path_.insert(std::begin(path_), std::make_move_iterator(std::begin(other.path_)), std::make_move_iterator(std::end(other.path_)));
return *this;
}
};
template<typename L, typename R>
typename std::enable_if<std::is_convertible<path, L>::value, path>::type operator+(const L& lhs, const R& rhs)
{
auto tmp = std::forward<L>(lhs);
tmp += std::forward<R>(rhs);
return tmp;
}
這顯然不是最優的形式。如果LHS是一個左值,那麼您只是冗餘地複製它。 – Puppy 2011-12-31 11:30:08
@DeadMG:Ehm ..'operator +'無論如何都會返回一個新副本。我沒有看到多餘的副本在哪裏? – Xeo 2011-12-31 11:35:42
lhs或rhs是否是一個xvalue並且可以重新使用? (只是一個想法) – Kos 2011-12-31 11:58:36