经过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;
}
这段代码编译,我能够对它进行单元测试。但我非常想摆脱这个警告(为了理解我做错了什么,即使它编译了)。
由于
答案 0 :(得分:4)
Neil提供的评论是有效的。在C ++ 11中,不推荐在函数签名中使用throw
而使用noexcept
。在这种情况下,我的构造函数的签名应该是:
explicit MyClass(string value) noexcept(false);
但是,由于noexcept(false)
默认应用于所有功能,除非指定noexcept
或noexcept(true)
,否则我只能使用:
explicit MyClass(string value);
回到如何解决“抛出的异常类型并非无法复制构建”的警告,我发现this post很好地解释了问题是什么以及如何解决它。