Все конструкторы std :: span объявлены constexpr, однако я не могу заставить их работать в контексте constexpr. Раскомментирование любого из constexpr ниже приведет к ошибке компиляции.
#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};
}
Действительно ли возможно создать тип span constexpr, так как кажется, что конструкторы никогда не могут быть оценены во время компиляции, когда они должны инициализировать указатель или ссылку?
Ответы:
Вы не можете использовать локальные переменные нестатических функций в таком постоянном выражении. Вам нужна стабильность адреса, и это достигается только статическими объектами. Изменение кода на
или
Позволяет создать
constexpr
std::span
.источник
constexpr
функции внутри функции (без явногоstatic
). У таких объектов есть статическая длительность хранения по умолчанию или это что-то другое?