我的 C++11 代码中有一个警告,我想正确修复它,但我真的不知道如何修复。我创建了自己的异常类,该类派生自 std::runtime_error
:
class MyError : public std::runtime_error
{
public:
MyError(const std::string& str, const std::string& message)
: std::runtime_error(message),
str_(str)
{ }
virtual ~MyError()
{ }
std::string getStr() const
{
return str_;
}
private:
std::string str_;
};
当我使用 /Wall
使用 clang-cl 编译该代码时,我收到以下警告:
warning: definition of implicit copy constructor for 'MyError' is deprecated
because it has a user-declared destructor [-Wdeprecated]
因此,因为我在 MyError
中定义了一个析构函数,所以不会为 MyError
生成复制构造函数。我不完全明白这是否会导致任何问题……
现在我可以通过简单地删除虚拟析构函数来消除该警告,但我一直认为如果基类(在本例中为 std::runtime_error
)具有虚拟析构函数,则派生类应该具有虚拟析构函数。
因此,我想最好不要删除虚拟析构函数,而是定义复制构造函数。但是如果我需要定义复制构造函数,也许我还应该定义复制赋值运算符和移动构造函数以及移动赋值运算符。但这对于我的简单异常类来说似乎有点过分了!?
任何想法如何最好地解决这个问题?
原文由 Linoliumz 发布,翻译遵循 CC BY-SA 4.0 许可协议
这将使您的代码在 clang 13 中 编译(但 不起作用):
您需要为复制构造函数填写适当的代码,
但也请注意,您 不需要所有 4 个函数,只需要那些被调用的函数。