警告:不推荐使用隐式复制构造函数的定义

新手上路,请多包涵

我的 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 许可协议

阅读 1.1k
1 个回答

这将使您的代码在 clang 13 中 编译(但 不起作用):

    MyError(const MyError&) {};
   MyError(MyError&&) {};
   MyError& operator=(const MyError&) {};
   MyError& operator=(MyError&&) {};

您需要为复制构造函数填写适当的代码,

但也请注意,您 不需要所有 4 个函数,只需要那些被调用的函数。

原文由 llewellyn falco 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题