c++11 - 何时在 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 中会发生复制省略,因此不会调用其他构造函数。我错过了什么吗?
解决方案
推荐阅读
- javascript - 对所有元素 mongoose 的特定字段求和
- javascript - JavaScript:转义符号后不匹配
- java - ParamConverterProvider 不适用于 Wildfly > 10.1.0 Final
- java - 为什么确切地应该首选 PhantomReference 来完成?
- python - 从 telnetlib python 3 获取重复的接收计数器输出
- fontforge - 如何在 Font Forge 中正确更改字体高度?
- javascript - 如何在对象数组的 shift() 之后使用 include()
- reactjs - React-Redux 创建操作以表单失败
- go - 附加到循环中的切片
- javascript - Javascript中的循环不一致/被忽略?