使用右值引用移动临时值
moving temporary value using rvalue reference
我正在尝试精简移动语义,我写了这个例子。我想将临时r值移动到堆栈上的对象中。
class MemoryPage
{
public:
size_t size;
MemoryPage():size(0){
}
MemoryPage& operator= (MemoryPage&& mp_){
std::cout << "2" <<std::endl;
size = mp_.size;
return *this;
}
};
MemoryPage getMemPage()
{
MemoryPage mp;
mp.size = 4;
return mp;
}
int main() {
MemoryPage mp;
mp = getMemPage();
std::cout << mp.size;
return 0;
}
我在getMemPage()的返回中得到这个错误:
error: use of deleted function 'constexpr MemoryPage::MemoryPage(const MemoryPage&)'
复制构造函数是:
[…]定义为删除,如果以下任何条件成立:
- T具有用户定义的移动构造函数或移动赋值运算符
为了解决眼前的问题,您只需提供一个复制构造函数,即:
MemoryPage(const MemoryPage&) { }
然而,正如评论中所指出的,用C++11将"三条规则"变成"五条规则"是一个好主意。特别是,本段总结了如果您忽视提供任何特殊成员功能,您可能会遇到的问题:
注意:
不会为显式声明任何其他特殊成员的类生成move构造函数和move赋值运算符功能
不会为显式声明移动构造函数或移动赋值的类生成复制构造函数和复制赋值运算符操作员
具有显式声明的析构函数和隐式定义的复制构造函数或隐式定义复制赋值运算符的类是被认为已弃用。
格式化为可读性
因此,在编写一个处理内存管理的类时,最好提供所有五个特殊成员函数,即:
class C {
C(const C&) = default;
C(C&&) = default;
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
virtual ~C() { }
};
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 设计将引用元素移动到开头的数据结构.C++
- 移动构造函数和右值引用
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 使用移动语义:右值引用作为方法参数
- 移动类的成员作为常量引用参数传递
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 垃圾回收正在移动内存中被引用的对象,破坏Unreal4引擎中的引用
- 为什么C++默认情况下不移动构造右值引用?
- 右值引用和局部变量的移动
- 为什么通过引用返回向量比通过移动返回要快得多?
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 通过引用捕获与移动,lambdas
- 在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099
- C 移动语义:将唯一_ptr引用的矩阵附加到向量
- 包含仅移动类型的类的构造函数应通过引用还是通过右值引用接收仅移动类型?
- 被引用的移动对象
- 我可以将数组每次移动引用传递给 std::thread 吗?
- 这是使用移动引用和unique_ptr的正确方式吗