Semua konstruktor std :: span dideklarasikan dengan constexpr, namun sepertinya saya tidak bisa membuat mereka bekerja dalam konteks constexpr. Membatalkan komentar salah satu dari constexpr di bawah ini akan menghasilkan kesalahan kompilasi.
#include <array>
#include <span>
int main()
{
constexpr int carray[3] = { 0, 1, 2 };
constexpr std::array<int, 3> array{ 0, 1, 2 };
using S = std::span<const int, 3>;
/*constexpr*/ S span1{ array.data(), 3 };
/*constexpr*/ S span2{array.begin(), array.end()};
/*constexpr*/ S span3{carray};
/*constexpr*/ S span4{array};
}
Apakah mungkin untuk membuat tipe span constexpr, karena sepertinya konstruktor tidak pernah dapat dievaluasi pada waktu kompilasi ketika mereka harus menginisialisasi pointer atau referensi?
Jawaban:
Anda tidak dapat menggunakan variabel lokal fungsi non-statis dalam ekspresi konstan seperti itu. Anda memerlukan stabilitas alamat dan itu hanya dicapai oleh objek statis. Memodifikasi kode menjadi
atau
Memungkinkan Anda membuat
constexpr
std::span
.sumber
constexpr
fungsi (tanpa eksplisitstatic
). Apakah objek tersebut memiliki durasi penyimpanan statis default atau ini sesuatu yang berbeda?