Когда в std :: move от * this в ref квалифицированном методе? - PullRequest
0 голосов
/ 01 марта 2020

Я играю с неизменными объектами после прочтения превосходной книги Функциональное программирование на 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 будет выполнено исключение копирования, чтобы не вызывать никаких дополнительных конструкторов. Я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...