Usando C ++ 11, Ubuntu 14.04, cadena de herramientas predeterminada de GCC .
Este código falla:
constexpr std::string constString = "constString";
error: el tipo 'const string {aka const std :: basic_string}' de la variable constexpr 'constString' no es literal ... porque ... 'std :: basic_string' tiene un destructor no trivial
¿Es posible usar std::stringen un constexpr? (aparentemente no ...) Si es así, ¿cómo? ¿Hay alguna forma alternativa de usar una cadena de caracteres en un constexpr?

std::stringno es un tipo literalstd::stringser constexpr? Hay varias implementaciones de cadenas en tiempo de compilación en SO. ¿Cuál es el punto de preguntar si puede hacer un constexpr de tipo no literal si comprende el mensaje de error y sabe que solo los tipos literales se pueden hacer constexpr? así que hay varias razones por las cuales uno puede querer tener una instancia constexpr, por lo que sugiero a aclarar su preguntaconstexprimplementaciones de cadenas por ahí.std::stringNo es uno de ellos.Respuestas:
No, y tu compilador ya te dio una explicación completa.
Pero podrías hacer esto:
En tiempo de ejecución, esto se puede utilizar para construir un
std::stringcuando sea necesario.fuente
constexpr auto constString = "constString";? No es necesario usar esa sintaxis de matriz fea ;-)char[]es más detallado / claro queautocuando intento enfatizar el tipo de datos a usar.auto;-)constexpr auto s = "c"sv;debido a la introducción destring_viewA partir de C ++ 20 , sí.
A partir de C ++ 17 , puede usar
string_view:A
string_viewes unstringobjeto similar que actúa como una referencia inmutable y no propietaria de cualquier secuencia decharobjetos.fuente
const std::string&una nueva cadena std :: debe construirse. Eso suele ser lo contrario de lo que uno tenía en mente al crear una constante. Por lo tanto, tiendo a decir que esta no es una buena idea. Al menos tienes que tener cuidado.string_viewno es implícitamente convertible astring, por lo que hay poco peligro de construir accidentalmente astringpartir de astring_view. Por el contrario,char const*es convertible implícitamente astring, por lo que el usostring_viewes realmente más seguro en este sentido.string_viewno es implícitamente convertible astring. En mi opinión, el problema que mencioné sigue siendo válido, pero no se aplicastring_viewespecíficamente. De hecho, como mencionó, es aún más seguro en ese sentido.string_viewes, en lugar de solo un enlace.C ++ 20 agregará
constexprcadenas y vectoresAl parecer, la siguiente propuesta ha sido aceptada : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf y agrega constructores como:
Además de las versiones constexpr de todos / la mayoría de los métodos.
No hay soporte a partir de GCC 9.1.0, lo siguiente no se compila:
con:
con error:
std::vectordiscutido en: No se puede crear constexpr std :: vectorProbado en Ubuntu 19.04.
fuente
Como el problema es el destructor no trivial, si el destructor se elimina del
std::string, es posible definir unaconstexprinstancia de ese tipo. Me gusta estofuente
string_view, excepto questring_viewle brinda la mayor parte de la funcionalidad que conocestd::string