【发布时间】:2018-08-22 16:36:38
【问题描述】:
在我的 Qt 项目中,我有一个如下所示的课程。我收到以下警告(已理解),并添加了一个虚拟 dtor。
dbmappingcomponentaware.h:25: warning: CDbMappingComponentAware has virtual functions but non-virtual destructor
现在我明白了
warning: definition of implicit copy assignment operator for 'CDbMappingComponentAware' is deprecated because it has a user-declared destructor
该类是一个普通的类,我没有声明任何运算符。我将如何解决这种冲突?
截至How to disable implicitly-defined copy constructor generation when there is user defined destructor,看来我必须接受“已弃用”警告,但我不确定。
代码sn-p:
//! Allows subcomponents to gain access to model component
class CDbMappingComponentAware {
public:
//! Destructor (added for 1st warning)
// virtual ~CDbMappingComponentAware() {}
//! Set the corresponding component
virtual void setMappingComponent(CDbMappingComponent *component);
...
...
-- 根据评论编辑--
阅读https://en.cppreference.com/w/cpp/language/copy_assignment 它说,
隐式定义的复制赋值运算符的生成是 如果 T 具有用户声明的析构函数,则弃用(C++11 起)或 用户声明的复制构造函数。
但这是为什么呢?我的意思是,为什么 dtor 会影响复制操作员?
【问题讨论】:
-
我猜你可以明确地声明它们
= default(或= delete)来关闭编译器。顺便说一句,无论编译器警告如何,显式通常都是一件好事。 -
但这并不意味着如果我定义了一个虚拟 dtor 就不能复制一个对象(除非我明确地编写了一个复制赋值运算符)。为什么这有意义?
-
你是说警告是为了强制执行三规则吗?由于我不处理资源,因此三规则在这里没有真正意义。我记得这条规则是指导方针,而不是必须的。在那种情况下,仍然不能真正理解
deprecated的警告意味着什么。还想知道为什么这是自 C++11 以来的新功能。但很好的提示!