为什么它不会移动?
Why won't it move?
这可能是编译器依赖的(使用VS2010),或者不是,但是为什么下面的操作不调用预期的移动行为:
LargeObject x;
x = SomeFunc(x);
我将函数定义为对
LargeObject SomeFunc(const LargeObject& ob)
{
LargeObject newOb;
// perform operation on new object using old object
return newOb;
}
LargeObject SomeFunc(LargeObject&& ob)
{
// change object directly...
return std::move(ob);
}
我需要明确地写
x = SomeFunc(std::move(x));
让它发生,我不喜欢那样…
编辑:第一个函数,利用const-ref,是因为我还需要做像 这样的事情LargeObject x;
LargeObject y = SomeFunc(x);
x
是左值,所以当您这样做时:
x = SomeFunc(x);
选择接受对const
的左值引用的重载,因为右值引用不能绑定到左值。如果您想要选择第二个过载,则必须以某种方式将x
转换为右值。这就是std::move
所做的。
…我不喜欢……
我相信你会更不喜欢它,如果传递一个对象给一个函数隐含地意味着移动它!
是否执行移动取决于如何指示编译器。首先,在一般情况下,编译器本身不会(并且不能)对代码执行语义分析,以确定在调用SomeFunc(x)
之后是否需要x
。
此外,如果下面两条指令在传递参数时导致不同的行为,那将非常奇怪:
SomeFunc(x); // Does not move
x = SomeFunc(x); // Moves!?
编译器没有理由在这里调用move函数。Move-ctor可以保证,作为参数传递的对象不会再被使用,而在您的情况下,x是一个局部变量,可以被使用(呸,它被用于下面的赋值操作,可以被重载等)。如果显式调用:
x = SomeFunc(std::move(x));
你冒着使用x被move操作损坏的风险(编译器不会在意,你再次将结果赋值给同一个变量)。
试题:
LargeObject ReturnsLargeObject()
{
LargeObject x;
return x;
}
SomeFunc(ReturnsLargeObject());
在这种情况下应该调用move函数
相关文章:
- 为什么复制而不是移动数据元素?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 为什么调用复制构造函数而不是移动构造函数?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 为什么协程的返回类型必须是可移动构造的?
- C++:为什么不调用移动构造函数?
- 为什么 std::vector 需要 is_trivial 才能按位移动,而不仅仅是is_trivially_copya
- C ++为什么在移动构造函数中需要移动/前进
- 为什么参数在构造 std::thread 时移动两次
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 为什么这里不调用移动构造函数?
- 为什么不调用移动构造函数
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 为什么调用移动分配?
- 为什么移动 std::可选不重置状态
- 为什么我的蛇只向上移动
- 该值将被复制而不是移动.为什么?
- c++数组比较和移动?为什么苹果不动?