我遇到以下情况,需要从 t1 中移动构造 t2。
不幸的是,这是不可能的(我想是违反常量的)
从 foo 的调用者那里透明地处理这个问题的正确方法是什么? (即不需要传值和显式 std::move)
struct T
{
T() = default;
~T() = default;
T(T&&) = default;
};
T foo(const T& t)
{
T t3;
if (predicate)
return t3;
else
return std::move(t);
}
int main()
{
T t1;
T t2 = foo(t1);
return 0;
}
从 foo 的调用者那里透明地处理这个问题的正确方法是什么?
你不能那样做,而事情本来就是这样的。左值永远不会被透明地移动。
由于移出的对象通常处于未知(但合法)的状态,因此如果客户端可以将左值作为参数传递给函数,并且允许该函数默默地从它移出,那将是危险的。客户端可能会在不知情的情况下留下一个僵尸对象!
因此,该语言强制执行以下规则:从左值移动必须是有意识的行为,并且应通过调用将左值显式转换为右值(实际上是 x 值)来发生std::move()
.
在这种情况下,我会说你的功能foo()
- 无论它实际上应该做什么 - 应该采用右值引用,并且客户端应该像这样调用它:
T t2 = foo(std::move(t1));
请注意,一旦您使用无意义的名称(例如),最后的建议可能不正确foo()
转化为反映某些具体程序中某些特定操作的语义的东西。然而,在不知道该操作的含义是什么的情况下,我只能提供关于如何编译代码片段以及如何总体考虑移动语义的正式、机械的建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)