Wszystkie konstruktory std :: span są zadeklarowane jako constexpr, jednak nie wydaje się, aby którykolwiek z nich działał w kontekście constexpr. Odznaczenie któregokolwiek z poniższych constexpr spowoduje błąd kompilacji.
#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};
}
Czy w rzeczywistości jest możliwe utworzenie typu rozpiętości constexpr, ponieważ wydaje się, że konstruktorów nigdy nie można ocenić w czasie kompilacji, gdy muszą zainicjować wskaźnik lub odwołanie?
Odpowiedzi:
Nie można używać zmiennych lokalnych o funkcji niestatycznej w takim wyrażeniu stałym. Potrzebujesz stabilności adresu i jest to osiągane tylko przez obiekty statyczne. Modyfikacja kodu na
lub
Pozwala utworzyć
constexpr
std::span
.źródło
constexpr
funkcji w ramach funkcji (bez wyraźnego określeniastatic
). Czy takie obiekty mają domyślny czas przechowywania statycznego, czy to coś innego?