У меня есть кусок кода, который выглядит следующим образом:
constexpr gsl::cstring_span<> const somestring{"Hello, I am a string"};
и он отказывается компилировать сообщение с жалобой на то, что где-то вызывается какая-то функция non-constexpr.
Почему это? Это кажется наиболее важным вариантом поддержки для поддержки. Весь смысл в том, чтобы иметь возможность проверять границы во время компиляции, если это вообще возможно. Компиляция проверки временных границ с использованием константных строковых литералов кажется наиболее подходящей для этого. Но это не может произойти, если это не может быть объявлено constexpr
, Что тут происходит?
Я думаю, что проблема заключается в том, что строковые литералы имеют массив типов const char
и заканчиваются нулем. Но кто скажет, что вы строите свой cstring_span
из массива с нулевым символом в конце?
Из-за этого конструктор cstring_span
выполняет физическую проверку, чтобы удалить нулевой терминатор, если он существует, в противном случае принять всю длину массива.
Я не уверен, насколько мощным constexpr
выражения могут быть но это может можно было бы реализовать это в constexpr
путь. Вы можете создать вопрос, спрашивая об этом здесь:
Других решений пока нет …