c++ - 不可复制和不可移动一起?

标签 c++ c++11

我想创建一个既不可复制又不可移动的基类。

class noncopyable {
protected:
  noncopyable() = default;
  ~noncopyable() = default;

  noncopyable(noncopyable const &) = delete;
  noncopyable &operator=(noncopyable const &) = delete;
};

class nonmovable {
protected:
  nonmovable() = default;
  ~nonmovable() = default;

  nonmovable(nonmovable &&) = delete;
  nonmovable &operator=(nonmovable &&) = delete;
};

是否存在类应该既不可复制又不可移动的情况?

class non : public noncopyable, public nonmovable {
};

class foo : public non {
};

如果有,这里“非”类的方便名称应该是什么?

最佳答案

有人争论过,例如here , 所展示的 nonmoveable 首先是一个坏主意。

有四种合理的选择:

  1. 类型自然是可复制和可移动的。
  2. 类型不可复制,但可移动。
    如果它正在管理资源,并且复制资源是不可能的,或者太昂贵以至于不受欢迎,这种情况经常发生。
  3. 类型没有特殊的可移动性——移动构造函数只是调用复制构造函数。
    如果出于技术原因,您不想为这种类型的对象创建“空状态”,或者没有便宜/自然的方式让移出的对象处于任何可接受的状态,那么这通常会发生。
  4. 类型既不可复制也不可移动。
    这可能发生在静态单例或类似的东西上,移动或复制它是你的程序中永远不应该发生的事情,你希望防止发生编译时错误。

如果类型是可复制的,但移动它失败了,这绝对是一个糟糕的安排,而应该移动以回退到复制。当拷贝没问题时让移动失败没有任何好处,它只会抑制通用编程。

所以也许你应该只有“noncopyable”和“non”,而不是“nonmoveable”?

关于c++ - 不可复制和不可移动一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35743586/

相关文章:

c++ - move 语义和 std::future

c++ - 为什么通过复制捕获的lambda具有与外部变量相同的地址

c++ - 是否有用于解析小数的良好 C++ 工具?

c++ - GetAsyncKeyState 不工作

c++ - (2d Square Collision Detection) 碰撞时移动物体

c++ - 有谁知道 "-FC"选项在 gcc g++ 中的作用?

c++ - 如何创建将检查我的校验和的测试(如何使我的代码损坏内存)

c++ - Visual C++ 字节 *

c++ - 识别 C++ 必要包含的快速方法

c++ - 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符