Имам тази част от кода:
#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 може да премахне постоянството или променливостта от всеки указател или препратка, използвайки получения указател или препратка за запис към обект, който е обявен за const или за достъп до обект, който е обявен за volatile, извиква недефинирано поведение. Те дори продължават да предоставят примери по-долу, вторият, който дадох , заявявайки, че трябва да даде недефинирано поведение.
Въпреки това, при компилиране на кода и стартиране (тук), вторият не дава грешка и отпечатва извън 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