为无复制/无移动类型扩展的最小类是什么?

What is the minimal class to extend for a no copy / no move type?

提问人:Josu Goñi 提问时间:8/30/2021 最后编辑:Josu Goñi 更新时间:8/30/2021 访问量:217

问:

假设我想创建一些类来管理不应复制或移动的资源,哪个是扩展和避免错误的最小类?

这个想法是,通过扩展类,我以 0/3/5 规则的安全侧结束。

我考虑到了这一点,这显然是有效的。

class NOCOPYNOMOVE {
    NOCOPYNOMOVE(NOCOPYNOMOVE &v) = delete;
    NOCOPYNOMOVE(NOCOPYNOMOVE &&v) = delete;
    NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &r) = delete;
    NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &&r) = delete;
};

class Foo: private NOCOPYNOMOVE {
public:
    Foo() {}
    ~Foo() {}
};
C++ 三法 则五

评论

2赞 asmmo 8/30/2021
问题是什么?
0赞 Pepijn Kramer 8/30/2021
我认为你已经很接近了,不确定你是否需要删除 operator=(&&)。我从来没有这样做过,但也许这对我来说是一个学习点。我还会保护默认构造函数。这样你就不会意外地创建实例。
0赞 Josu Goñi 8/30/2021
@PKramer我认为它确实不需要,因为它不会自动生成,但这更明确。
1赞 Brotcrunsher 8/30/2021
询问时 - 您可以省略参数名称。所以而不是.minimal(NOCOPYNOMOVE &)(NOCOPYNOMOVE &v)
0赞 Josu Goñi 8/30/2021
@asmmo我已经发布了一个看似解决方案的内容,但我不确定它是否正确,因为C++可能非常棘手(理想情况下,默认情况下所有内容都将“删除”)。

答:

2赞 Alex Guteniev 8/30/2021 #1
  • 不需要删除移动构造函数,请参阅 https://stackoverflow.com/a/38820178/2945027
  • 避免使用 name,因为每个用于宏的约定都使用名称ALL_CAPS
  • 没有理由在复制构造函数/赋值中省略,因此应首选通常的形式const
  • 如果类继承自某个命名空间中的某些类,则可能会触发意外的 ADL。 通过将定义放在命名空间中来解决它,请参阅实现NOCOPYNOMOVEboost::noncopyablenoncopyable_
  • 我宁愿没有一些基础,而是在目标类中拼出这两三行:
class Foo {
public:
    Foo() {}
    ~Foo() {}

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

评论

0赞 Josu Goñi 8/30/2021
是的,我正在使用,因为我正在考虑编写类似宏的东西。将这两行添加为宏也会很有趣,但我不知道是否可以在宏中获取类名。添加最后 2 行本身并不能使意图明确。ALL_CAPS