首页 > 解决方案 > 何时在 ref 限定方法中从 *this 移动 std::move?

问题描述

在阅读了优秀的 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;

};

我知道这是实现不可变向量的一种愚蠢方式,但这不是问题的重点。我的问题是如何实现右值限定的成员函数 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 中会发生复制省略,因此不会调用其他构造函数。我错过了什么吗?

标签: c++11functional-programmingimmutabilitymove-semantics

解决方案


推荐阅读