Menggunakan C ++ 11, Ubuntu 14.04, GCC toolchain default .
Kode ini gagal:
constexpr std::string constString = "constString";
error: tipe 'const string {alias const std :: basic_string}' dari variabel constexpr 'constString' tidak literal ... karena ... 'std :: basic_string' memiliki destruktor non-sepele
Apakah mungkin untuk digunakan std::string
dalam constexpr
? (ternyata tidak ...) Jika demikian, bagaimana? Apakah ada cara alternatif untuk menggunakan string karakter dalam constexpr
?
std::string
bukan tipe literalstd::string
menjadi constexpr? ada beberapa implementasi string kompilasi-waktu pada SO. apa gunanya bertanya apakah Anda dapat membuat constexpr tipe non-literal jika Anda memahami pesan kesalahan dan tahu hanya tipe literal yang dapat dibuat constexpr? juga ada beberapa alasan mengapa seseorang mungkin ingin memiliki instance constexpr, jadi saya sarankan Anda mengklarifikasi pertanyaan Andaconstexpr
implementasi string di luar sana.std::string
bukan salah satu dari mereka.Jawaban:
Tidak, dan kompiler Anda sudah memberi Anda penjelasan yang komprehensif.
Tetapi Anda bisa melakukan ini:
Saat runtime, ini dapat digunakan untuk membangun
std::string
ketika dibutuhkan.sumber
constexpr auto constString = "constString";
? Tidak perlu menggunakan sintaks array jelek ;-)char[]
lebih verbose / jelas daripadaauto
ketika saya mencoba untuk menekankan tipe data yang digunakan.auto
;-)constexpr auto s = "c"sv;
karena pengenalanstring_view
Pada C ++ 20 , ya.
Pada C ++ 17 , Anda dapat menggunakan
string_view
:A
string_view
adalahstring
objek seperti-yang bertindak sebagai referensi yang tidak berubah dan tidak memiliki urutanchar
objek apa pun .sumber
const std::string&
string std :: baru harus dibangun. Itu biasanya kebalikan dari apa yang ada dalam pikiran ketika membuat konstanta. Karena itu, saya cenderung mengatakan bahwa ini bukan ide yang baik. Setidaknya kamu harus hati-hati.string_view
tidak dapat dikonversi secara implisitstring
, jadi ada sedikit bahaya jika tidak sengaja membangunstring
daristring_view
. Sebaliknya,char const*
adalah implisit dikonversi kestring
, sehingga menggunakanstring_view
sebenarnya lebih aman dalam pengertian ini.string_view
secara implisit tidak dapat dikonversistring
. IMO masalah yang saya kemukakan masih valid tetapi tidak berlakustring_view
secara khusus. Bahkan, seperti yang Anda sebutkan, itu bahkan lebih aman dalam hal itu.string_view
itu, bukan hanya tautan.C ++ 20 akan menambahkan
constexpr
string dan vektorProposal berikut tampaknya telah diterima : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf dan proposal itu menambahkan konstruktor seperti:
selain versi constexpr dari semua / sebagian besar metode.
Tidak ada dukungan pada GCC 9.1.0, yang berikut gagal dikompilasi:
dengan:
dengan kesalahan:
std::vector
dibahas di: Tidak dapat membuat constexpr std :: vectorDiuji di Ubuntu 19,04.
sumber
Karena masalahnya adalah destruktor non-sepele jadi jika destruktor dihapus dari
std::string
, mungkin untuk menentukanconstexpr
contoh dari tipe itu. Seperti inisumber
string_view
, kecuali yangstring_view
memberi Anda sebagian besar fungsi yang Anda tahustd::string