在 Qt 中移动语义而不使用指针?

Mar*_*ltr 3 qt move move-semantics c++11 qt5

我有一个 Qt 项目,那里有一个对象,它将被复制很多次。因此我想添加移动语义。

#ifndef OBJECTTOCOPY_H
#define OBJECTTOCOPY_H

#include <QColor>
#include <QString>
#include <QDataStream>
namespace level_1     {
namespace level_2 {
class ObjectToCopy {
public:

  explicit ObjectToCopy(const QString& _name = "", const QColor& colorBody = QColor() );

  // MOVE
  ObjectToCopy(ObjectToCopy && other);  

  static quint32 _valueInt32;
  static quint16 _valueInt16;
  QString _name;
  QColor  _colorBody;

private:
};
}
}
#endif // OBJECTTOCOPY_H
Run Code Online (Sandbox Code Playgroud)

由于成员变量不是指针,因此如何窃取它们的指针?

ObjectToCopy::ObjectToCopy (ObjectToCopy&& other)
    : _valueInt32( other._valueInt32  )
    , _valueInt16( other._valueInt16 )
    , _name( other._name )
    , _colorBody( other._colorBody )
{
    other._valueInt32 = 0;
    other._valueInt16 = 0;
    other.name.clear();
    other._colorBody = QColor();    
}
Run Code Online (Sandbox Code Playgroud)
  1. 这对于非指针有意义吗?
  2. 可以像 string.clear(); 一样重置 QString 吗?为垃圾收集器标记它?
  3. 如何重置 QColor 对象?

Elo*_*eth 5

当然,您可以添加移动语义,但在您的情况下根本不需要这样做。quint32、quint16 通过复制移动。QColor 是 union 的包装器,没有移动构造函数(并且不需要),并且也可以通过复制来移动。QString是QT中的引用计数类型。它在最新版本的库中具有移动构造函数,但速度差异很小(交换指针和递增引用计数器之间的差异)。