gpt4 book ai didi

c++ - 不可复制的成员是否可以用作使对象不可复制的替代方法?

转载 作者:行者123 更新时间:2023-11-27 23:43:28 25 4
gpt4 key购买 nike

具有不可复制成员的类被称为也是不可复制的。从 SO 开始,要使类不可复制,这些是选项:

  1. 使用 boost::noncopyable
  2. 将构造函数和赋值运算符声明为私有(private)。
  3. 删除复制构造函数。

    class foo 
    {
    private:
    std::mutex _dummy;
    };

问题:为了类似的目的和简单起见,包含一个虚拟的不可复制的成员是否会被使用?缺点是什么?

最佳答案

自 C++11 起,使类不可复制的正确习惯用法是 = delete复制构造函数/赋值运算符。这就是 C++ 程序员被告知要做的,也是其他 C++ 程序员在您的类中寻找该行为时期望看到的。

有一个不可复制的子对象(成员或基类)很好,因此您的默认复制构造函数/赋值运算符将被隐式删除。但是您应该只对恰好不可复制的子对象执行此操作。也就是说,你有一个 unique_ptr<T>mutex或者作为成员(member)的任何东西,因为你需要 unique_ptr<T>mutex作为类实例数据。不是因为您将其用作使类型不可复制的技巧。

为此目的使用成员子对象的缺点是:

  1. 它混淆了代码的含义。你的mutex _dummy;例子告诉我你的类型有一个 mutex在里面。如果没有任何东西使用该变量,那么这告诉我您的代码相当不连贯;如果不需要子对象,则无需声明。 = delete是正确的成语,所以它是你应该使用的。

  2. boost::noncopyable是 C++98/03 的习惯用法,因为它是一个空类。因此,常见的空基优化将确保它不会占用派生类中的任何空间。空成员没有这样的优化,所以成员 boost::noncopyable总是会让你的类(class)更大,没有任何优势。虽然您可以指出即将推出的 C++20 [[no_unique_address]]属性,请参阅原因 #1。

关于c++ - 不可复制的成员是否可以用作使对象不可复制的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com