【问题标题】:Is there a std::noncopyable (or equivalent)?是否有 std::noncopyable (或等价物)?
【发布时间】:2015-11-03 15:02:06
【问题描述】:

有一个boost::noncopyable,我的库中有自己的不可复制类。在最新的 C++ 标准中是否存在 std::noncopyable 或等效项?

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

【问题讨论】:

    标签: c++ standard-library


    【解决方案1】:

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

    class MyClass
    {
       MyClass(const MyClass&) = delete;
       MyClass& operator=(const MyClass&) = delete;
    }:
    

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

    使类不可复制的声明(上)可以在公共或私有部分。

    如果您真的不想每次都输入所有内容,您可以随时定义一个宏,例如:

    #define NONCOPYABLE(Type) Type(const Type&)=delete; Type& operator=(const Type&)=delete
    
    class MyClass
    {
        NONCOPYABLE(MyClass);
    
        // etc.
    };
    
    
    
      
    

    【讨论】:

    • 您还需要删除一个复制分配运算符以使该类不可复制
    • @PiotrSkotnicki 我在看到您的评论之前将其添加到我的答案中,但这使得它无法分配。
    • 移动可以像“交换”一样实现,或者它可以留下2个看起来相同但原始项目不再具有“所有权”的副本,因此当它被删除时它不会删除数据。移动对象的状态必须是稳定的,但没有任何其他保证。被移动到的对象的状态应该与被移动的对象相同。
    • “但是这使得它不可赋值” 所以assignmant 不是复制操作? boost::noncopyable 不会让您将一个实例复制分配给另一个
    • 总之,有趣的是,“标准 C++ 方式”的做法充满了麻烦,主要是因为开发人员不能 100% 确定他们应该如何去做。我的意思是,如果我要再次这样做,我会去谷歌搜索。我认为标准库中确实需要它。
    【解决方案2】:

    我相信你已经通过阅读 CashCow 的帖子想通了,但我想我不妨为不可复制的类提供一个基类。

    class Noncopyable {
    public:
        Noncopyable() = default;
        ~Noncopyable() = default;
    
    private:
        Noncopyable(const Noncopyable&) = delete;
        Noncopyable& operator=(const Noncopyable&) = delete;
    };
    

    【讨论】:

    • 这是 Scott Meyers 的建议(第 39 页 Effective C++ 第 3 版)
    • 我认为将删除的方法设为“public”而不是“private”会更好,这样编译器会首先抱怨使用删除的函数而不是访问私有函数。 coliru.stacked-crooked.com/a/ee5ef146f1a9b24c
    • 析构函数不应该是虚拟的吗?
    • NonCopyable 使用 =delete 时无需将其设为私有,它可以在任何定义的地方工作。因此,如果您不想每次都写出宏,则制作宏会更简单。
    • 默认的构造函数和析构函数应该是protected,因为直接实例化Noncopyable的对象是没有意义的,只是(名义上)作为一些派生的、实际有用的类型的基类.
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多