Usando C ++ 11, Ubuntu 14.04, cadeia de ferramentas padrão do GCC .
Este código falha:
constexpr std::string constString = "constString";
erro: o tipo 'const string {aka const std :: basic_string}' da variável constexpr 'constString' não é literal ... porque ... 'std :: basic_string' possui um destruidor não trivial
É possível usar std::string
em um constexpr
? (aparentemente não ...) Se sim, como? Existe uma maneira alternativa de usar uma cadeia de caracteres em um constexpr
?
std::string
não é um tipo literal #std::string
ser constexpr? existem várias implementações de string em tempo de compilação no SO. qual é o sentido de perguntar se é possível criar um tipo não literal constexpr se você entende a mensagem de erro e sabe que apenas tipos literais podem ser constexpr? assim há várias razões pelas quais se pode querer ter uma instância constexpr, então eu sugiro que você esclarecer sua perguntaconstexpr
implementações de strings por aí.std::string
não é um deles.Respostas:
Não, e seu compilador já lhe deu uma explicação abrangente.
Mas você pode fazer isso:
Em tempo de execução, isso pode ser usado para construir um
std::string
quando necessário.fonte
constexpr auto constString = "constString";
? Não há necessidade de usar essa sintaxe de matriz feio ;-)char[]
é mais detalhado / claro do queauto
quando estou tentando enfatizar o tipo de dados a ser usado.auto
;-)constexpr auto s = "c"sv;
devido à introdução destring_view
A partir do C ++ 20 , sim.
A partir do C ++ 17 , você pode usar
string_view
:A
string_view
é umstring
objeto parecido que age como uma referência imutável e não proprietária de qualquer sequência dechar
objetos.fonte
const std::string&
uma nova std :: string. Isso geralmente é o oposto do que se tinha em mente ao criar uma constante. Portanto, costumo dizer que essa não é uma boa ideia. Pelo menos você tem que ter cuidado.string_view
não é implicitamente conversível emstring
, portanto, há pouco risco de construir acidentalmente astring
de astring_view
. Por outro lado,char const*
é implicitamente conversível emstring
, portanto, o usostring_view
é realmente mais seguro nesse sentido.string_view
não é implicitamente conversívelstring
. OMI, o problema que levantei ainda é válido, mas não se aplicastring_view
especificamente. De fato, como você mencionou, é ainda mais seguro nesse sentido.string_view
é, em vez de apenas um link.C ++ 20 adicionará
constexpr
strings e vetoresAparentemente, a seguinte proposta foi aceita : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf e adiciona construtores como:
além das versões constexpr de todos / a maioria dos métodos.
Não há suporte no GCC 9.1.0, o seguinte falha ao compilar:
com:
com erro:
std::vector
discutido em: Não é possível criar constexpr std :: vectorTestado no Ubuntu 19.04.
fonte
Como o problema é o destruidor não trivial, portanto, se o destruidor for removido do
std::string
, é possível definir umaconstexpr
instância desse tipo. Como issofonte
string_view
, exceto questring_view
fornece a maior parte das funcionalidades que você conhecestd::string