移动POD-ish类型的语义

时间:2014-02-26 17:21:07

标签: c++ move-semantics

是否有任何一点实现移动构造函数并为仅包含基本类型的结构或类移动赋值运算符?例如,

struct Foo
{
    float x;
    float y;
    float z;

    /// ... ctor, copy ctor, assignment overload, etc...


};

我可以看到,如果我有更复杂的东西,比如:

struct Bar
{
    float x,y,z;
    std::string Name;
};  

我宁愿移动Name而不是复制它,移动ctor也会有意义。然而,“移动”浮动并不(语义上)对我有意义。

思想?

3 个答案:

答案 0 :(得分:5)

即使您拥有std::string成员,实现移动构造函数也没有意义。隐式移动构造函数已经移动了每个成员,在float的情况下只会复制它,在std::string的情况下会移动它。

当你的类正在进行一些自己的内存管理时,你应该只需要提供一个移动构造函数。也就是说,如果您在构造函数中分配内存,那么您将需要在移动期间将指针传输到分配的内存。请参阅Rule of Five

如果您始终依靠智能指针来处理分配的内存,则可以完全避免这种情况。请参阅Rule of Zero

答案 1 :(得分:3)

请注意,完全符合要求的C ++ 11/14编译器(不是当前版本的VS2013)应自动为您的Bar {{生成移动操作 1}}:

struct

通常,您应该仅为直接资源管理器明确编写移动操作,其行为类似于“构建块”。当您在更复杂的类中组合构建块时,编译器应自动生成移动操作(使用成员移动)。

答案 2 :(得分:2)

没必要。如果类/结构中只有原始类型,那么默认的构造函数/赋值运算符实际上就是这样做。