具有不可复制成员的类也被称为不可复制。从SO来说,要使类不可复制,可以使用以下选项:
删除副本构造函数。
class foo
{
private:
std::mutex _dummy;
};
问题:是否将包含虚拟不可复制成员用于类似目的和简化?不利之处是什么?
答案 0 :(得分:3)
自C ++ 11起,使类不可复制的适当习惯是= delete
复制构造函数/赋值运算符。这就是C ++程序员被告知要做的事情,也是其他C ++程序员在查找类中的行为时期望看到的东西。
最好有一个不可复制的子对象(成员或基类),因此默认的复制构造函数/赋值运算符将被隐式删除。但是,您应该只对可能是无法复制的子对象执行此操作。也就是说,您拥有unique_ptr<T>
或mutex
或其他成员,因为您 需要unique_ptr<T>
或mutex
作为类实例数据。并不是因为您将其用作一种使该类型不可复制的技巧。
为此目的使用成员子对象的缺点是:
它混淆了代码的含义。您的mutex _dummy;
示例告诉我,您的类型中包含mutex
。如果没有任何人使用该变量,那么这告诉我您的代码相当不连贯。如果不需要子对象,则无需声明一个。 = delete
是适当的习惯用法,因此应使用它。
boost::noncopyable
是C ++ 98/03惯用语,因为它是一个空类。因此,常见的空基优化将确保它不会在派生类中占用任何空间。空成员没有得到这样的优化,因此成员boost::noncopyable
总是会使您的类变大,而没有优势。虽然您可以指向即将到来的C ++ 20 [[no_unique_address]]
属性,但请参阅原因1。