Ограничения размера constexpr С++ 23? Итерация от 0x4000 = ок до 0x5000 = не постоянное выражениеC++

Программы на C++. Форум разработчиков
Anonymous
Ограничения размера constexpr С++ 23? Итерация от 0x4000 = ок до 0x5000 = не постоянное выражение

Сообщение Anonymous »

Следующий код работает и печатает пересечение, как и ожидалось. Однако при изменении max_codepoint с 0x4000 на 0x5000 он перестает работать с ошибкой:
ConsoleApplication1.cpp(149, 30): [C2131] expression did not evaluate to a constant
Я попытался изменить 0x4000 на 0x5000 (или, точнее, 0xffff, чтобы получить полный диапазон UTF-16) и ожидал, что это сработает. Тем не менее, это не так.
Я также хотел изменить возвращаемый результат vec_to_array, чтобы использовать Cross.size(), который должен быть постоянным выражением, учитывая consteval context, но это тоже по какой-то причине не работает. Что я там неправильно понимаю? Очевидно, что он может вычислять диапазоны во время компиляции, поэтому он знает размер во время компиляции.
#include
#include
#include

using ImWchar = unsigned short;

consteval std::vector ConstGetGlyphRangesLatin()
{
return {
0x0020, 0x00FF, // Basic Latin + Latin Supplement
};
}

consteval std::vector ConstGetGlyphRangesGW()
{
return {
0x20, 0x7f,
0xa1, 0xff,
0x100, 0x180,
0x0391, 0x0460,
0x2010, 0x266b,
0x3000, 0x3020,
0x3041, 0x3100,
0x3105, 0x312a,
0x3131, 0x318f,
0xac00, 0xd7a4,
0x4e00, 0x9fa6,
0xf900, 0xfa6b,
0xff01, 0xffe7
};
}

consteval bool in_range(const ImWchar c, const std::vector& range)
{
for (size_t i = 0; i < range.size() - 1; i += 2) {
if (c >= range && c

Подробнее здесь: https://stackoverflow.com/questions/787 ... 0x5000-not

Вернуться в «C++»