and c++11 stdstring constexpr

c++11 - and - constexpr in c++



¿Es posible usar std:: string en un constexpr? (3)

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

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; }

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 constexpr variable ''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 manera alternativa de usar una cadena de caracteres en un constexpr ?


En C ++ 17, puede usar string_view :

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

Un string_view es un objeto tipo string que actúa como una referencia inmutable y no propietaria de cualquier secuencia de objetos char .


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 una std :: string cuando sea necesario.