提问人:Josu Goñi 提问时间:8/30/2021 最后编辑:Josu Goñi 更新时间:8/30/2021 访问量:217
为无复制/无移动类型扩展的最小类是什么?
What is the minimal class to extend for a no copy / no move type?
问:
假设我想创建一些类来管理不应复制或移动的资源,哪个是扩展和避免错误的最小类?
这个想法是,通过扩展类,我以 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() {}
};
答:
2赞
Alex Guteniev
8/30/2021
#1
- 不需要删除移动构造函数,请参阅 https://stackoverflow.com/a/38820178/2945027
- 避免使用 name,因为每个用于宏的约定都使用名称
ALL_CAPS
- 没有理由在复制构造函数/赋值中省略,因此应首选通常的形式
const
- 如果类继承自某个命名空间中的某些类,则可能会触发意外的 ADL。 通过将定义放在命名空间中来解决它,请参阅实现
NOCOPYNOMOVE
boost::noncopyable
noncopyable_
- 我宁愿没有一些基础,而是在目标类中拼出这两三行:
class Foo {
public:
Foo() {}
~Foo() {}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
};
评论
0赞
Josu Goñi
8/30/2021
是的,我正在使用,因为我正在考虑编写类似宏的东西。将这两行添加为宏也会很有趣,但我不知道是否可以在宏中获取类名。添加最后 2 行本身并不能使意图明确。ALL_CAPS
评论
minimal
(NOCOPYNOMOVE &)
(NOCOPYNOMOVE &v)