Es posible usar std::string en un constexpr?


Usando C++11, Ubuntu 14.04, cadena de herramientas por defecto 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 unconstexpr? (aparentemente no... Si es así, ¿cómo? ¿Hay una forma alternativa de usar una cadena de caracteres en un constexpr?

Author: Vector, 2014-11-25

3 answers

No, y su compilador ya le dio una explicación completa.

Pero podrías hacer esto:

constexpr char constString[] = "constString";

En tiempo de ejecución, esto se puede usar para construir un std::string cuando sea necesario.

 97
Author: tenfour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-25 07:50:16

En C++17, puede usar string_view:

constexpr std::string_view sv = "hello, world";

A string_view es a string-objeto similar que actúa como una referencia inmutable y no propietaria a cualquier secuencia de objetos char.

 65
Author: Joseph Thomson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 16:19:10

Dado que el problema es el destructor no trivial, si el destructor se elimina del std::string, es posible definir una instancia constexpr de ese tipo. Así

struct constexpr_str {
    char const* str;
    std::size_t size;

    // can only construct from a char[] literal
    template <std::size_t N>
    constexpr constexpr_str(char const (&s)[N])
        : str(s)
        , size(N - 1) // not count the trailing nul
    {}
};

int main()
{
    constexpr constexpr_str s("constString");

    // its .size is a constexpr
    std::array<int, s.size> a;
    return 0;
}
 14
Author: neuront,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-17 08:35:12