Разрешено ли отбрасывать const на объекте, определенном const, если он фактически не модифицирован? - PullRequest
0 голосов
/ 03 февраля 2019

Допустимо ли следующее:

const int const_array[] = { 42 };

int maybe_inc(bool write, int* array) {
  if (write) array[0]++;
  return array[0];
}

int main() {
  return maybe_inc(false, const_cast<int *>(const_array));
}

В частности, можно ли отбрасывать константу const_array, которая была определена как const, покаобъект на самом деле не изменен, как в примере?

1 Ответ

0 голосов
/ 03 февраля 2019

Да.Это полностью законно.(Это опасно, но это законно.) Если вы (пытаетесь) изменить объект, объявленный как const, поведение не определено.

С n4659 (что является последним черновиком)C ++ 17), раздел 10.1.7.1 [dcl.type.cv], пункт 4:

За исключением того, что любой член класса, объявленный как изменяемый (10.1.1), может быть изменен, любойпопытка изменить объект const во время его жизни (6.8) приводит к неопределенному поведению

Мой акцент.Это из C ++ 17, но это справедливо для всех версий C ++.

Если вы посмотрите на раздел по const_cast, есть примечание, что

[Примечание. В зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате const_cast, который отбрасывает const-qualifier76, может привести к неопределенному поведению (10.1.7.1).- конечная заметка]

Примечания не являются нормативными, но это строго подразумевает, что получение неконстантной ссылки или указателя на константный объект является законным.Запрещена запись.

...