移动语义和常量引用
Move semantics and const references
我花了很多时间为我的类实现移动语义,但现在我正在处理使用它的函数。
好的,我有一个对象,它在堆上有很多数据:CLargeOb
,我为它实现了移动语义(构造函数和运算符=)。它的理想用途是:
void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals
m_largeOb2 = (CLargeOb&&)largeOb2;
}
然而,并不总是可以允许对象被移动/丢弃,所以我添加了以下两个功能:
void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = largeOb1;
m_largeOb2 = (CLargeOb&&)largeOb2;
}
void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1;
m_largeOb2 = largeOb2;
}
虽然它有效,但你已经可以猜到,当我有一个函数将其中3个或更多的对象作为参数时,它将成为*ss中的一个主要问题。。。难道没有一种聪明的方法可以使用模板或"完美转发"来解决这个问题吗?
与C++03中的情况一样,准则是:如果您想要一个副本,请在参数列表中创建它。
这让调用者处理你如何获得对象,你只需要获得一个对象,不管:
void OtherOb::Func(CLargeOb largeOb1, CLargeOb largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = std::move(largeOb1); // save as members and trash the originals
m_largeOb2 = std::move(largeOb2); // (you should use std::move, not cast)
}
来电者:
OtherOb o;
CLargeOb x, y;
const CLargeOb z;
o.Func(x, std::move(y)); // need x for later, done with y so move it
o.Func(std::move(x), z); // done with x, necessarily copy z
这和几个专门的重载一样有效。为什么因为这些已经作为构造函数存在于类中。让编译器为您确定在调用站点调用哪个,它已经知道该做什么了。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 将常量指针引用绑定到非常量指针
- 通过常量引用传递参数的矩阵模板类
- 按值捕获引用时出现非常量
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么按值传递QStringView比引用常量更快?
- 通过引用常量函数调用另一个类的非常量函数
- 构造常量对象与引用常量对象
- 引用“常量value_type”时出错
- 为什么可以在 for 语句中重新分配引用常量
- 程序反馈:命名循环索引和引用常量数据
- 堆还是栈?在c++中函数调用中引用常量字符串时
- 为什么常量结构数组在按名称引用常量结构时不放在 .rodata 中?
- 为什么编译器允许在函数中发送对迭代器的引用,该函数引用常量迭代器