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::string
en un constexpr
? (aparentemente no ...) Si es así, ¿cómo? ¿Hay alguna forma alternativa de usar una cadena de caracteres en un constexpr
?
std::string
no es un tipo literalstd::string
ser 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 preguntaconstexpr
implementaciones de cadenas por ahí.std::string
No 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::string
cuando sea necesario.fuente
constexpr auto constString = "constString";
? No es necesario usar esa sintaxis de matriz fea ;-)char[]
es más detallado / claro queauto
cuando intento enfatizar el tipo de datos a usar.auto
;-)constexpr auto s = "c"sv;
debido a la introducción destring_view
A partir de C ++ 20 , sí.
A partir de C ++ 17 , puede usar
string_view
:A
string_view
es unstring
objeto similar que actúa como una referencia inmutable y no propietaria de cualquier secuencia dechar
objetos.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_view
no es implícitamente convertible astring
, por lo que hay poco peligro de construir accidentalmente astring
partir de astring_view
. Por el contrario,char const*
es convertible implícitamente astring
, por lo que el usostring_view
es realmente más seguro en este sentido.string_view
no es implícitamente convertible astring
. En mi opinión, el problema que mencioné sigue siendo válido, pero no se aplicastring_view
específicamente. De hecho, como mencionó, es aún más seguro en ese sentido.string_view
es, en lugar de solo un enlace.C ++ 20 agregará
constexpr
cadenas 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::vector
discutido 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 unaconstexpr
instancia de ese tipo. Me gusta estofuente
string_view
, excepto questring_view
le brinda la mayor parte de la funcionalidad que conocestd::string