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.