Używając C ++ 11, Ubuntu 14.04, domyślnego łańcucha narzędzi GCC .
Ten kod nie działa:
constexpr std::string constString = "constString";
błąd: typ 'const string {aka const std :: basic_string}' zmiennej constexpr 'constString' nie jest dosłowny ... ponieważ ... 'std :: basic_string' ma nietrywialny destruktor
Czy można użyć std::string
w constexpr
? (najwyraźniej nie ...) Jeśli tak, to jak? Czy istnieje alternatywny sposób użycia ciągu znaków w constexpr
?
std::string
nie jest typem dosłownymstd::string
być constexpr? istnieje kilka implementacji ciągu znaków czasu kompilacji w SO. Jaki jest sens w pytaniu, czy możesz utworzyć nieliteralny typ constexpr, jeśli rozumiesz komunikat o błędzie i wiesz, że tylko typy literalne mogą być konstruowane jako constexpr? Jest też kilka powodów, dla których warto mieć instancję constexpr, więc proponuję wyjaśnić swoje pytanieconstexpr
implementacje stringów.std::string
nie jest jednym z nich.Odpowiedzi:
Nie, a Twój kompilator już udzielił Ci wyczerpujących wyjaśnień.
Ale możesz to zrobić:
W czasie wykonywania można to wykorzystać do skonstruowania pliku w
std::string
razie potrzeby.źródło
constexpr auto constString = "constString";
? Nie ma potrzeby używania tej brzydkiej składni tablicowej ;-)char[]
jest bardziej szczegółowy / wyraźny niżauto
wtedy, gdy próbuję podkreślić typ danych do użycia.auto
;-)constexpr auto s = "c"sv;
ze względu na wprowadzeniestring_view
Od C ++ 20 , tak.
Od C ++ 17 możesz używać
string_view
:A
string_view
jeststring
podobnym do obiektu obiektem, który działa jako niezmienne, nieposiadające właściciela odniesienie do dowolnej sekwencjichar
obiektów.źródło
const std::string&
nowy std :: string, należy skonstruować. Zwykle jest to przeciwieństwo tego, co mieliśmy na myśli, tworząc stałą. Dlatego zwykle mówię, że to nie jest dobry pomysł. Przynajmniej musisz być ostrożny.string_view
nie jest niejawnie konwertowane nastring
, więc istnieje niewielkie ryzyko przypadkowego skonstruowania astring
z plikustring_view
. I na odwrót,char const*
jest niejawnie zamienialny nastring
, więc używaniestring_view
jest w tym sensie bezpieczniejsze.string_view
nie można tego domyślnie zamienić nastring
. IMO problem, który poruszyłem, jest nadal aktualny, ale nie dotyczystring_view
konkretnie. W rzeczywistości, jak wspomniałeś, pod tym względem jest jeszcze bezpieczniej.string_view
, co jest, zamiast tylko linku.C ++ 20 doda
constexpr
ciągi i wektoryNastępująca propozycja została najwyraźniej zaakceptowana : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf i dodaje konstruktory takie jak:
oprócz wersji constexpr wszystkich / większości metod.
Nie ma wsparcia od GCC 9.1.0, następujące elementy nie mogą się skompilować:
z:
z błędem:
std::vector
omówione w: Cannot create constexpr std :: vectorTestowane w Ubuntu 19.04.
źródło
Ponieważ problemem jest nietrywialny destruktor, więc jeśli destruktor zostanie usunięty z elementu
std::string
, możliwe jest zdefiniowanieconstexpr
instancji tego typu. Lubię toźródło
string_view
jest, oprócz tego, żestring_view
daje większość funkcji, które znasz zstd::string