es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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 como constexpr o una variable miembro estática como constexpr la convierte implícitamente en inline, se genera este mensaje. Sin embargo, esto no significa que el destructor sea constexpr o consteval. No es posible declarar el destructor de esta clase como constexpr o consteval porque tiene un miembro de datos no estático de tipo std::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 en constexpr, la respuesta es no. El hecho de que una función tenga un valor predeterminado no implica que se convierta automáticamente en constexpr. 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 ser constexpr.

Comments are closed.