想象一下我们有一个平凡可复制的类型:
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
时是否存在任何技术缺陷?
std::move
可以明确地显示它。 - llllllllllstd::move
,对于平凡类型的特殊情况,一般情况的代码仍然可以正确运行,所以你应该坚持使用它。但这只是我的观点,这是Stack Overflow不喜欢的。 - nwpstd::move
,因为这正是我想要对该对象进行的操作。我非常希望不要让我的代码过于专业化,但有时可能会出现棘手的编译器优化问题。 - Disenchanted