防御性地将std :: move应用于普通可复制类型是不可取的吗?

时间:2018-03-12 17:28:56

标签: c++

想象一下,我们有一个简单的可复制类型:

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是否存在任何技术缺陷?

1 个答案:

答案 0 :(得分:6)

  

但是,保持_write调用的一个优点是,如果将std::move类型更改为不再可以轻易复制,则客户端代码将不会以静默方式执行额外的复制操作,更合适的举措。

这是正确的,你应该考虑的事情。

  

所以我的问题是应用冗余Trivial是否存在任何技术缺陷?

取决于移动对象的消耗位置。在std::move的情况下,一切都很好,因为push_back同时具有push_backconst T&重载,直观行为。

想象一下,T&&重载的另一个函数与T&&的行为完全不同:代码的语义将随const T&而变化。