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