Прежде всего, вы используете расширение компилятора, но об этом позже.
Стандартная перегрузка begin
, которая работает для вас - это шаблон, который принимает ссылку намассив с размером, который является константным выражением.В двух словах, константные выражения - это те выражения, которые компилятор может оценить и узнать значение во время компиляции.
Постоянное целое число, инициализированное постоянным выражением, таким как const int ci = 3;
, может использоваться везде, где требуется постоянное выражение,Таким образом, ci
для всех целей является самим константным выражением (равным 3).
В современном C ++ есть способ выделить такие переменные в виде намеченных константных выражений, это спецификатор constexpr
,Таким образом, вы можете определить ci
так:
constexpr int ci = 3;
Это точно так же, как ваш исходный код.Но то же самое не будет работать для const int m = v.size();
.Потому что constexpr
требует истинного константного выражения в качестве инициализатора, в отличие от const
.Для const
переменная не обязательно является константным выражением.Это может быть переменная времени выполнения, которую вы не можете изменить.И это в случае с m
.
Поскольку m
не является константным выражением, вы определили массив переменной длины .Функция AC, которая иногда вводится как расширение компиляторами C ++.И это не гель с шаблоном std::begin
, который ожидает, что экстент массива будет константным выражением .