Функция 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.

Другие вопросы по тегам