【发布时间】:2012-08-03 21:07:03
【问题描述】:
我花了很多时间为我的班级实现移动语义,但现在我正在处理使用它的函数。
好的,所以我有一个在堆上有很多数据的对象: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 的主要痛苦......难道没有聪明的方法来解决这个问题吗?模板还是“完美转发”?
【问题讨论】:
-
@MooingDuck:在 VS2010 中运行良好,没问题。要调用运算符 =(&&),您必须使用 std::move 或 && 强制转换显式调用它。但是下面提供的解决方案当然要好得多。
-
@demorge:哦,对了,我完全忘记了命名时规则的变化。对此感到抱歉
-
请写
std::move(largeOb1)而不是(CLargeOb&&)largeOb1。一代又一代的程序员将感谢您使用标准 C++11 方式来实现移动,而不是使用非惯用和边界不可读的 C/C++ 组合。 -
另外,您可能对以下FAQ entry 的移动语义感兴趣。