Я играю с неизменными объектами после прочтения превосходной книги Функциональное программирование на C ++ . Предположим, у меня есть класс для неизменяемого вектора, подобный этому:
template<typename T>
class immutable_vector
{
public:
immutable_vector() {}
immutable_vector<T> push_back(const T& t) const &
{
immutable_vector result(*this);
result.data.push_back(t);
return result;
}
//What is the best way to implement this? (see below)
immutable_vector<T> push_back(const T& t) &&;
private:
std::vector<T> data;
};
Я знаю, что это глупый способ реализации неизменяемого вектора, но это не главное. Мой вопрос о том, как реализовать функцию-член с квалификацией rvalue push_back.
Вариант 1
immutable_vector<T> push_back(const T & t) &&
{
data.push_back(t);
return std::move(*this);
}
Вариант 2
immutable_vector<T> push_back(const T & t) &&
{
immutable_vector<T> result(std::move(*this));
result.data.push_back(t);
return result;
}
Вот как это делает автор книги.
Мой вопрос
Один путь лучше другого или они полностью эквивалентны?
Я предположил, что они будут эквивалентны, потому что в обоих случаях конструктор перемещения вызывается один раз. Я также предположил бы, что в Варианте 2 будет выполнено исключение копирования, чтобы не вызывать никаких дополнительных конструкторов. Я что-то упустил?