18

在中断 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;
} 

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

4

1 回答 1

9

尼尔提供的评论是有效的。在 C++ 11 中,使用throwin 函数签名已被弃用,取而代之的是noexcept. 在这种情况下,我的构造函数的签名应该是:

explicit MyClass(string value) noexcept(false);

但是,由于noexcept(false)默认情况下应用于所有函数,除非noexceptnoexcept(true)指定,我可以简单地使用:

explicit MyClass(string value);

回到如何解决“抛出的异常类型不是可构造的复制”警告,我发现这篇文章很好地解释了问题所在以及如何解决它。

于 2017-10-26T22:11:59.780 回答