我在我的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
)有虚析构函数,则派生类应该有虚析构函数。因此,我想最好不要移除虚析构函数,而是定义拷贝构造函数。但是,如果我需要定义拷贝构造函数,也许我还应该定义拷贝赋值运算符和移动构造函数以及移动赋值运算符。但是,对于我的简单异常类来说,这似乎有点过度设计了!?
有什么好的解决方法吗?
MyError(MyError const&) = default;
来抑制警告。您还可以摆脱析构函数的定义,因为它将由于基类的析构函数是虚拟的而隐式变成虚拟的。 - Praetorian