Возвращаясь к разработке на 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;
}
Этот фрагмент кода компилируется, и я могу выполнить его модульное тестирование. Но я бы очень хотел избавиться от этого предупреждения (чтобы понять, что я делаю неправильно, даже если оно компилируется).
Спасибо
Комментарий, предоставленный Нилом, действителен. В C ++ 11, используя throw
в функции подпись устарела в пользу noexcept
, В этом случае подпись моего конструктора должна была быть:
explicit MyClass(string value) noexcept(false);
Но с тех пор noexcept(false)
применяется по умолчанию ко всем функциям, если только noexcept
или же noexcept(true)
указано, я могу просто использовать:
explicit MyClass(string value);
Возвращаясь к тому, как исправить предупреждение «Выброшенный тип исключения не является копируемым», я обнаружил, что эта почта это очень хорошо объясняет, в чем проблема и как ее исправить.
Других решений пока нет …