Const_cast позволяет изменить constness на путь, который ведет к const?

Учитывая этот код (из моего последнего поста здесь):

  const int j = 5; // constant object
  const int *p = &j; // `p` is a const access path to `j`

  int *q = const_cast<int *>(p); // `q` is a non-const access path to `j`
  *q = 10;

  cout << *q << endl;

Выход: 10

Это должно быть так? Я думал, что этот код должен был привести к неопределенному поведению, так как j является постоянным Я ошибся?

Спасибо

3 ответа

Решение

Неопределенное поведение может быть чем угодно - оно может делать именно то, что вы хотите, или оно может разрушить вселенную. Если возможно, избегайте неопределенного поведения, так как я не хочу, чтобы меня уничтожали только потому, что вы слишком ленивы, чтобы делать что-то правильно.

http://en.wikipedia.org/wiki/Undefined_behavior

Это, в частности, позволяет компилятору делать все, что проще и эффективнее, если такая программа будет представлена. В общем, любое поведение впоследствии также не определено. В частности, никогда не требуется, чтобы компилятор диагностировал неопределенное поведение - поэтому программы, вызывающие неопределенное поведение, могут казаться скомпилированными и даже запускаться сначала без ошибок, только для сбоя в другой системе или даже в другую дату. Когда происходит случай с неопределенным поведением, то, что касается языковой спецификации, может произойти все, может быть, вообще ничего.

Не потребовалось бы много оптимизатора, чтобы понять, что

*q = 10;
std::cout << *q;
// not use q anymore

Может быть переписан как

std::cout << 10;

А также q может быть удален, потому что теперь он не используется.

После этого, p а также j больше не используются, а также могут быть удалены.

Все это при условии, что вы не ввели какое-либо неопределенное поведение в вашу программу. Предположение, что компилятор может сделать это.

Другие вопросы по тегам