处理“抛出的异常类型不是无法复制构造”警告

时间:2017-10-11 21:29:23

标签: c++ c++11 exception std clang-tidy

经过12年的中断后回到C ++开发。我正在使用JetBrains的CLion软件,因为它提供了很多关于我的课程设计可能出现的问题的输入。我在类的构造函数throw语句中得到的警告之一是:Thrown exception type is not nothrow copy constructible。以下是生成此警告的代码示例:

#include <exception>
#include <iostream>

using std::invalid_argument;
using std::string;

class MyClass {
    public:
        explicit MyClass(string value) throw (invalid_argument);
    private:
        string value;
};

MyClass::MyClass(string value) throw (invalid_argument) {
    if (value.length() == 0) {
        throw invalid_argument("YOLO!"); // Warning is here.
    }

    this->value = value;
} 

这段代码编译,我能够对它进行单元测试。但我非常想摆脱这个警告(为了理解我做错了什么,即使它编译了)。

由于

1 个答案:

答案 0 :(得分:4)

Neil提供的评论是有效的。在C ++ 11中,不推荐在函数签名中使用throw而使用noexcept。在这种情况下,我的构造函数的签名应该是:

explicit MyClass(string value) noexcept(false);

但是,由于noexcept(false)默认应用于所有功能,除非指定noexceptnoexcept(true),否则我只能使用:

explicit MyClass(string value);

回到如何解决“抛出的异常类型并非无法复制构建”的警告,我发现this post很好地解释了问题是什么以及如何解决它。