如何解决什么样的引用应该在带有移动语义的C++中使用move()成员函数?
在 C++11 之前实现 move()
方法以避免复制。在 C++11 中引入了移动语义,但有时使用 move()
方法并从移动构造函数和移动 operator=
调用它更容易。 move()
方法可以通过普通引用(l-reference)或 r-reference 获取对象。
我们应该使用什么参考?什么选择更好/更清洁/更快/...?
这是有两种可能性的示例代码(需要 C++20):
#include <iostream>
#include <ranges> // copy,size
#include <memory> // unique_ptr
using namespace std;
constexpr bool MOVE_WITH_LREF_IS_BETTER = true;
class Array
{
size_t size_ = 0;
unique_ptr<int[]> data_;
public:
template<size_t N>
Array(const int (&src)[N]) : size_(N),data_(make_unique<int[]>(N))
{
std::ranges::copy(src,data_.get());
}
Array(Array&& src)
{
if constexpr(MOVE_WITH_LREF_IS_BETTER)
move_lref(src);
else
move_rref(std::move(src));
}
Array& operator=(Array&& src)
{
if constexpr(MOVE_WITH_LREF_IS_BETTER)
move_lref(src);
else
move_rref(std::move(src));
return *this;
}
void move_lref(Array& src)
{
if (&src != this)
{
size_ = exchange(src.size_,0);
data_ = std::move(src.data_);
}
}
void move_rref(Array&& src)
{
if (&src != this)
{
size_ = exchange(src.size_,0);
data_ = std::move(src.data_);
}
}
auto operator[](size_t index) const
{
if (index >= size_)
{
throw out_of_range("");
}
return data_[index];
}
};
int main()
{
constexpr int srcArray[] = { 1,9,0 };
Array a(srcArray);
Array b = std::move(a);
for (size_t i=0; i < ranges::size(srcArray); ++i)
cout << b[i] << "\n";
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。