Обработка & quot; Тип исключенного исключения не является копируемым конструктором & quot; Предупреждение

Возвращаясь к разработке на C ++ после 12-летнего перерыва. Я использую программное обеспечение 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;
}

Этот фрагмент кода компилируется, и я могу выполнить его модульное тестирование. Но я бы очень хотел избавиться от этого предупреждения (чтобы понять, что я делаю неправильно, даже если оно компилируется).

Спасибо

8

Решение

Комментарий, предоставленный Нилом, действителен. В C ++ 11, используя throw в функции подпись устарела в пользу noexcept, В этом случае подпись моего конструктора должна была быть:

explicit MyClass(string value) noexcept(false);

Но с тех пор noexcept(false) применяется по умолчанию ко всем функциям, если только noexcept или же noexcept(true) указано, я могу просто использовать:

explicit MyClass(string value);

Возвращаясь к тому, как исправить предупреждение «Выброшенный тип исключения не является копируемым», я обнаружил, что эта почта это очень хорошо объясняет, в чем проблема и как ее исправить.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]