使用 LValue 引用移动语义
Move semantics with LValue reference
所以Move语义很棒,为我们提供了更高的性能。
我读到这是一个全新的功能,没有 C++11,就"不可能"做到这一点。
但是我们可以在C++11之前做到这一点吗?就像下面这样的东西。
class AAA
{
private:
int* m_data;
public:
AAA(int _data) : m_data(new int(_data)) { }
AAA(AAA& _other) // Not using RValue reference.
{
m_data = _other.m_data;
_other.m_data = nullptr;
}
~AAA() { delete m_data; }
};
int main()
{
AAA sth1(100);
AAA sth2(sth1)
return 0;
}
我认为 RValue 引用的存在是为了不使参数略有不同的相同函数(如 Const 和 Non-Const)。
简单地说,使用RValue引用,这只是另一种"类型",我们可以同时执行复制构造函数和移动构造函数。仅此而已。
想知道我是否正确或错过了一些巨大的东西。
提前谢谢。
std::auto_ptr
完全按照你的建议做了。 问题在于它使行为变得混乱和复制不可能。 右值引用允许创建既可以移动又可以复制的类。
右值引用允许基于上下文自动移动/复制(例如临时的移动),尝试使用左值样式复制构造函数(实际执行移动)模拟这一点可能是灾难性的。
我的理解是,移动语义不仅是可能的,而且可以作为C++03编译器的库(Boost.Move)(可能有一些限制)。但是,语言实现可能是必要的,既可以在不接触任何代码的情况下进行自由优化,也可以尽可能简化其使用。
是的,缺少一些东西,即使它们是非常量,你也不会得到左值。 非常量左值不能从临时生成,因此在这种情况下您的尝试不起作用。
如果你想把右值传递给你的构造函数怎么办?您的 ctor 将失败,因为它是非恒量。 使用右值引用,您可以将右值传递给 ctor,并从中移动,因为右值始终是临时的。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 视觉理解移动C++标准的语义
- 如何通过move语义移动多个参数