У меня есть фрагмент кода со следующей грубой подписью:
void evaluate(object * this)
{
static const int briefList[] = { CONSTANT_A, CONSTANT_Z };
static const int fullList[] = { CONSTANT_A, CONSTANT_B, ..., CONSTANT_Z};
const int const * pArray;
const int nElements;
int i;
if ( this->needDeepsEvaluation )
{
pArray = fullList;
nElements = sizeof(fullList) / sizeof(fullList[0]);
}
else
{
pArray = briefList;
nElements = sizeof(briefList) / sizeof(briefList[0]);
}
for ( i = nElements; i; i-- )
{
/* A thousand lines of optimized code */
}
this->needsDeepEvaluation = 0;
}
Большинство компиляторов с радостью проглотят назначение pArray, но подавятся назначениями nElements. Это несоответствие смущает меня, и я хотел бы быть просветленным.
У меня нет проблем с принятием того, что вы не можете назначить целое число const, но тогда почему это работает так, как я ожидаю для const-pointer-to-const?
Быстрое и дешевое решение состоит в том, чтобы удалить квалификатор const, но это может привести к незначительным ошибкам, так как большая часть кода в цикле макроизображена (я был укушен этим один раз). Как бы вы реструктурировали вышеперечисленное, чтобы разрешить постоянный счетчик элементов?