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
больше не используются, а также могут быть удалены.
Все это при условии, что вы не ввели какое-либо неопределенное поведение в вашу программу. Предположение, что компилятор может сделать это.