Это не «ошибка» в MSVC, потому что это не работа компилятора, а время выполнения.
const int ci; // error ci is a constant object in Stack-memory so it must be initialized at compile-time.
const int* cpi; // ok. just a pointer to const. The compiler doesn't know whether you'll assign an initialized const object or not.
int choice = 0;
std::cin >> choice;
if(choice == arbitraryValue)
cpi = new const int; // or cpi = new cont int(anotherArbitraryValue );
Как вы можете видеть, это разрешено, потому что при компиляциивремя, когда компилятор не знает, как объект будет создан и инициализирован во время выполнения.
Похоже, что вы спрашиваете:
int a[]{1, 2, 3, 4};
int index;
cin >> index; // e.g: user enters 10
cout << a[i];
Почему компилятор позволяет использовать индекс out range? Опять же, потому что компилятор не знает об этом значении времени выполнения;он проверяет только то, является ли тип индекса связанным типом, который можно использовать для доступа к индексу массива.