Функция constexpr не должна быть объявлена встроенной.
Анализируя код с помощью SonarLint, я получил сообщение (название вопроса) о деструкторе , который объявлен, как показано ниже:
class Foo
{
public:
. // default ctor
. // parameterized ctor
.
inline ~Foo() = default; // dtor
.
. // copy ctor = delete
. // copy assignment operator = delete
. // move ctor
. // move assignment operator
private:
...
mutable std::vector< std::vector<char> > m_Matrix;
...
};
Вот описание сообщения : Объявление функции или статической переменной-члена constexpr делает ее неявно встроенной.
Я не думаю, что dtor этого класса может быть или
consteval
потому что он имеет нестатический член данных типа
std::vector
так
~Foo
должен позвонить
delete[]
в какой-то момент освободить хранилище вектора.
Так почему же SonarLint показывает это сообщение? Это из-за
= default
? Становится ли какая -либо специальная функция-член по умолчанию неявно
constexpr
?
1 ответ
Да:
Функция с явным значением по умолчанию, которая не определена как удаленная, может быть объявлена или
consteval
только если он совместим с constexpr ([специальный], [class.compare.default]). Функция, явно заданная по умолчанию при первом объявлении, является неявно встроенной ([dcl.inline]) и неявно constexpr ([dcl.constexpr]), если она совместима с constexpr.
(Из явно заданных по умолчанию функций , выделено мной.)
Foo, вероятно, совместим с constexpr в C++20, потому что
std::vector
теперь может быть
constexpr
.