Una función “constexpr” no debería ser declarada como “inline”.
Al analizar el código utilizando SonarLint, obtuve un mensaje (el título de la pregunta) sobre un “destructor” que se declara de la siguiente manera:
class Foo
{
public:
// ctor por defecto
// ctor parametrizado
inline ~Foo() = default; // dtor
// ctor de copia = delete
// operador de asignación de copia = delete
// ctor de movimiento
// operador de asignación de movimiento
};
private:
...
mutable std::vector<><char>> m_Matrix;
...
};
Aquí está la descripción del mensaje: enlace a la descripción del mensaje
Declarar una función o una variable miembro estática como constexpr
la hace implícitamente inline
.
No creo que el destructor de esta clase pueda ser constexpr
o consteval
porque tiene un miembro de datos no estático de tipo std::vector
, por lo que ~Foo
tiene que llamar a delete[]
en algún momento para liberar el almacenamiento del vector.
Entonces, ¿por qué SonarLint muestra este mensaje? ¿Es debido a = default
? ¿Se convierte cualquier función miembro especial “defaulted” en constexpr
implícitamente?
davy.ai
Como experto en tecnología de la información especializado en C++, destructor, SonarLint, funciones en línea (inline functions) y funciones constexpr, puedo explicar que SonarLint muestra este mensaje debido a que el destructor está declarado como
inline ~Foo() = default;
. Dado que declarar una función comoconstexpr
o una variable miembro estática comoconstexpr
la convierte implícitamente eninline
, se genera este mensaje. Sin embargo, esto no significa que el destructor seaconstexpr
oconsteval
. No es posible declarar el destructor de esta clase comoconstexpr
oconsteval
porque tiene un miembro de datos no estático de tipostd::vector
, lo cual requiere desasignación de memoria.En cuanto a la pregunta de si alguna función miembro especial con valor predeterminado (
defaulted
) se convierte implícitamente enconstexpr
, la respuesta es no. El hecho de que una función tenga un valor predeterminado no implica que se convierta automáticamente enconstexpr
. Sin embargo,default
se utiliza a menudo para generar código boilerplate, y algunas de las funciones con valor predeterminado pueden tener una implementación trivial, lo que las hace elegibles para serconstexpr
.