У меня есть этот фрагмент кода:
#include <iostream>
using namespace std;
class X {
public:
const int x;
X(int i) : x(i) { }
int getX() const { return x; }
};
int main()
{
const X d(45);
const_cast<X *>(&d)->x = 47;
cout << d.getX() << endl;
const int j = 3; // j is declared const
int* pj = const_cast<int*>(&j);
*pj = 4;
cout << *pj << endl; //should not work, like above
return 0;
}
Как я нашел здесь, несмотря на то, что const_cast может удалить константность или изменчивость из любой указатель или ссылка, использование результирующего указателя или ссылки для записи в объект, который был объявлен константным, или для доступа к объекту, который был объявлен изменчивым, вызывает неопределенное поведение. Они даже продолжают приводить примеры ниже, второй я дал , заявив, что это должно давать неопределенное поведение.
Однако при компиляции кода и запуске (здесь) второй не выдает ошибок и печатает выходит 4
постоянно. В то время как первый выдает ошибку:
assignment of read-only member 'X::x'
const_cast<X *>(&d)->x = 47;
Конечно, удаление const
из объявления x
в X
заставляет его работать нормально. Тем не менее, это также тот же тип вреда, что и первый, изменение const
вещи через указатель после приведения ее const_ptr<>
. Но первый работает, а второй нет. Почему так?
4
я получаю неопределенное поведение? Я не должен получить его? - person SexyBeast   schedule 11.01.20154
— это один из возможных случаев неопределенного поведения. Спрашивать, что должно делать неопределенное поведение, бессмысленно. - person Mike Seymour   schedule 11.01.2015