想象一下,我们有一个简单的可复制类型:
struct Trivial
{
float A{};
int B{};
}
构造并存储在std::vector
:
class ClientCode
{
std::vector<Trivial> storage{};
...
void some_function()
{
...
Trivial t{};
fill_trivial_from_some_api(t, other_args);
storage.push_back(std::move(t)); // Redundant std::move.
...
}
}
通常,这是一个毫无意义的操作,因为无论如何都会复制对象。
但是,保持std::move
调用的一个优点是,如果将Trivial
类型更改为不再可以轻易复制,则客户端代码将不会以静默方式执行额外的复制操作,一个更合适的举动。 (在我的场景中很可能出现这种情况,其中使用普通类型来管理外部资源。)
所以我的问题是应用冗余std::move
是否存在任何技术缺陷?
答案 0 :(得分:6)
但是,保持
_write
调用的一个优点是,如果将std::move
类型更改为不再可以轻易复制,则客户端代码将不会以静默方式执行额外的复制操作,更合适的举措。
这是正确的,你应该考虑的事情。
所以我的问题是应用冗余
Trivial
是否存在任何技术缺陷?
取决于移动对象的消耗位置。在std::move
的情况下,一切都很好,因为push_back
同时具有push_back
和const T&
重载,直观行为。
想象一下,T&&
重载的另一个函数与T&&
的行为完全不同:代码的语义将随const T&
而变化。