web-dev-qa-db-ja.com

「スローされた例外タイプは、コピーを構築できません」の処理警告

12年間の休止の後、C++開発に戻ります。私はJetBrainsのCLionソフトウェアを使用しています。これは、クラス設計で発生する可能性のある問題について多くの情報を提供するので素晴らしいです。クラスのコンストラクターthrowステートメントで発生する警告の1つは、次のとおりです。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;
} 

このコードはコンパイルされ、ユニットテストを行うことができます。しかし、私はこの警告を取り除きたいと思っています(コンパイルされたとしても、私が間違っていることを理解するために)。

ありがとう

12

ニールからのコメントは有効です。 C++ 11では、関数シグニチャでのthrowの使用は非推奨になり、noexceptが優先されます。この場合、コンストラクターの署名は次のようになっているはずです。

_explicit MyClass(string value) noexcept(false);
_

ただし、noexcept(false)はデフォルトですべての関数に適用されるため、noexceptまたはnoexcept(true)が指定されていない限り、次のように簡単に使用できます。

_explicit MyClass(string value);
_

「スローされた例外タイプはコピーを作成できません」という警告を修正する方法に戻ると、問題の内容と修正方法を非常によく説明している この投稿 が見つかりました。

4