У меня есть реализация класса исключения, который наследуется от std::runtime_error
:
class custom_error : public std::runtime_error {
public:
explicit custom_error(const std::string &arg)
: std::runtime_error(arg){};
~custom_error() noexcept override = default;
};
Эта реализация, насколько это возможно, идентична реализации libstdc++
других подклассов std::runtime_error
.
При запуске clang-tidy над этим кодом (в некоторых случаях - см. Ниже) выдается следующее предупреждение:
warning: thrown exception type is not nothrow copy constructible [cert-err60-cpp]
Соответствующая информация об этой проверке доступназдесь .Я считаю, что понимаю информацию на этой странице.В частности, я считаю, что соответствующая информация заключается в том, что std::runtime_error
и его подклассы должны иметь черту is_nothrow_copy_constructible
.
. У меня возникли проблемы при согласовании следующего.
Сценарий 1:
Следующий код в проводнике компилятора демонстрирует, что класс is_nothrow_copy_constructible
при компиляции с gcc 5.x и новее, но не при компиляции с gcc 4.x.
Сценарий 2:
На моем ноутбуке, работающем под управлением Ubuntu 18.04, тот же класс также is_nothrow_copy_constructible
при компиляции с gcc 5, gcc 7, clang 3.8, clang 5 и clang 6, причем все они связаны с libstdc++.so.6.0.25
.
Сценарий 3:
На travis-ci, работающем с экземпляром Ubuntu 14.04, я не могу найти ни одной конфигурации, в которой тот же класс is_nothrow_copy_constructible
.Это включает в себя использование gcc 5, gcc 6, gcc 7, clang 4 и clang 5, связанных с libstdc++.so.6.0.25
.
. Здесь приведен специальный журнал сборки travis , демонстрирующий сбой теста, который используетGCC 5, связанный с libstdc++.so.6.0.25
.(custom_error
переименовывается просто Exception
.)
Вопрос:
Может ли кто-нибудь объяснить мне, что может определять, является ли класс is_nothrow_copy_constructible
?
КМне, выше, демонстрирует, что ответ может отличаться, когда:
- реализация
- компилятор и
- стандартная версия библиотеки
идентичны.