Const_cast позволява да се промени константата до път, който води до 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 е константа. Греша ли ?

Благодаря


person JAN    schedule 14.07.2012    source източник
comment
Така че вашият истински въпрос е Позволено ли е на програма с недефинирано поведение да извежда 10\n на конзолата? и отговорът е Да.   -  person Ben Voigt    schedule 14.07.2012
comment
Мислехте, че води до неопределено поведение. Така стана. Къде е проблема?   -  person Konrad Rudolph    schedule 14.07.2012
comment
Even though const_cast may remove constness from any pointer or reference, using the resulting pointer or reference to write to an object that was declared const invokes undefined behavior. Така че това е недефинирано поведение. Източник   -  person Olwaro    schedule 14.07.2012
comment
@Olwaro: Прекрасно, няма да го използвам в бъдеще.   -  person JAN    schedule 14.07.2012
comment
Този почти идентичен const_casting въпрос пита защо изходът не е променен.   -  person Bo Persson    schedule 14.07.2012


Отговори (3)


Недефинираното поведение може да бъде всичко - може да прави точно това, което искате, или може да унищожи вселената. Ако е възможно, избягвайте недефинирано поведение, тъй като всъщност не искам да бъда унищожен само защото ви мързи да правите нещата правилно.

person Christian Stieber    schedule 14.07.2012

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

Това специално освобождава компилатора да прави всичко, което е най-лесно или най-ефективно, ако такава програма бъде изпратена. По принцип всяко поведение след това също е недефинирано. По-специално, никога не се изисква компилаторът да диагностицира недефинирано поведение — следователно програмите, извикващи недефинирано поведение, може да изглеждат като компилиращи и дори да работят без грешки в началото, само за да се провалят на друга система или дори на друга дата. Когато възникне случай на недефинирано поведение, що се отнася до спецификацията на езика, всичко може да се случи, може би нищо.

person Caesar    schedule 14.07.2012

Няма да е необходим много оптимизатор, за да осъзнае това

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

Може да се пренапише като

std::cout << 10;

И q може да се премахне, защото сега не се използва.

След това p и j също не се използват повече и също могат да бъдат премахнати.

Всичко това при условие, че вие не сте въвели никакво недефинирано поведение в програмата си. Предположение, което компилаторът може да направи.

person Bo Persson    schedule 14.07.2012