std::cout << a[42] << std::endl;
std::cout << 42[a] << std::endl;
Это одно и то же - все уже привыкли.
А как насчет инициализации массива с указанием ренжа индексов?
Типа:
static constexpr int a[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Или инициализации единицы для вайтспейстов:
int whitespace[256] =
{
[' '] = 1, ['\t'] = 1,
['\f'] = 1, ['\n'] = 1,
['\r'] = 1
};
Это нормально без дополнительных выкрутасов работает на clang, правда, грустит и плюется ворнингами.
Эта штука называется Designated Initializers, и является частью ISO C99, а С++ пытается быть совместимым с С90, а 99 - оно так, по желанию.
На годболте у меня так и не получилось скомпилировать вот такой пример на gcc:
#include <iostream>
int main() {
static constexpr int a[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
std::cout << a[42] << std::endl;
std::cout << 42[a] << std::endl;
int whitespace[256] =
{
[' '] = 1, ['\t'] = 1,
['\f'] = 1, ['\n'] = 1,
['\r'] = 1
};
return 0;
}
однако локально он нормально компилируется вот такой командной строкой:
g++ --std=gnu++23 main.cpp
Вот какие-то такие развлечения....