是否有std :: noncopyable(或等效的)?

Rob*_*son 18 c++ standard-library

有一个boost :: noncopyable我在我的库里有我自己的noncopyable类.在最新的C++标准中是否有std :: noncopyable或等效的敲门声?

这是一件小事,但是从这样一个阶级派生出来的意图更加清晰.

Cas*_*Cow 16

不,因为有一种标准方法可以使类不可复制:

class MyClass
{
   MyClass(const MyClass&) = delete;
   MyClass& operator=(const MyClass&) = delete;
}:
Run Code Online (Sandbox Code Playgroud)

但是,通过从MyClass &&重载构造函数,可以使不可复制的类可移动.

使该类不可复制的声明(上文)可以在公共或私人部分.

您还必须以类似的方式禁用复制分配(并且在不允许复制的情况下允许复制分配是非常罕见的,尽管在某些情况下允许复制,这是标准允许的原因)

  • 您还需要删除copy-assignemnt运算符以使该类不可复制 (17认同)
  • 所以总而言之,有趣的是,这样做的"标准C++方式"充满了麻烦,主要是因为开发人员并不是100%确定他们应该如何做到这一点.我的意思是,如果我再次这样做,我会google它.我认为在标准库中肯定需要它. (6认同)

小智 13

我确定你已经通过阅读CashCow的帖子弄明白了,但我想我也可以为不可复制的类提供基类.

class Noncopyable {
public:
    Noncopyable() = default;
    ~Noncopyable() = default;

private:
    Noncopyable(const Noncopyable&) = delete;
    Noncopyable& operator=(const Noncopyable&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

  • 这是 Scott Meyers 推荐的(第 39 页 Effective C++ 3rd ed。) (3认同)
  • 默认的构造函数和析构函数应该是“受保护的”,因为直接实例化“不可复制”的对象是没有意义的,只能(理论上)作为某些派生的、实际有用类型的基类。 (3认同)
  • 我认为将删除的方法设置为"公共"而不是"私有"会更好,因此编译器会首先抱怨使用已删除的函数而不是访问私有函数.http://coliru.stacked-crooked.com/a/ee5ef146f1a9b24c (2认同)
  • 也就是说,宏基本上永远不是答案,而且我不认为这里有什么可取的。 (2认同)