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.

constexpr genera una advertencia en GCC cuando se usa con literales de cadena.

El código a continuación se compila:

#include <iostream>

int main( )
{
    const char* const str = "This is a constant string.";

    std::cout << str << '\n';
}

Sin embargo, este código muestra una advertencia:

constexpr char* const str = "This is a constant string.";

Aquí:

advertencia: ISO C++ prohíbe convertir una constante de cadena en ‘char’ [-Wwrite-strings]
37 | constexpr char const str = “This is a constant string.”;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

¿Es esto un error en GCC? ¿Estoy convirtiendo una cadena en un puntero que apunta a una matriz de tipo ‘constexpr char’? ¿Es válida esta advertencia?

Ahora, hacer que el propio puntero sea ‘constexpr’ evita que se compile en absoluto:

const char* constexpr str = "This is a constant string.";

Aquí:

error: expected unqualified-id before ‘constexpr’
37 | const char* constexpr str = “This is a constant string.”;
| ^~~~~~~~~

¿Por qué un puntero no puede ser ‘constexpr’?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La advertencia no es un error en GCC. La razón de la advertencia es que convertir una cadena literal en un puntero no constante permite la posibilidad de modificar el contenido de la cadena, lo cual no está permitido para las cadenas literales. Al hacer que el puntero sea constexpr, el compilador no puede usar la dirección de la cadena literal como una expresión constante.

    En C++, un puntero constexpr debe apuntar a un objeto o función constexpr. Las cadenas literales no son objetos constexpr, por lo que no se pueden utilizar con punteros constexpr. Por eso es que el ejemplo final no se compila.

Comments are closed.