0

このコードを考えると(私の最後の投稿から):

  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

このようになっているのでしょうか?jconstであるため、このコードは未定義の動作につながるはずだと思いました。私が間違っている ?

ありがとう

4

3 に答える 3

2

Undefined behavior can be anything -- it could do exactly what you want to it do, or it could destroy the universe. If possible, avoid undefined behavior since I don't really want to be destroyed just because you're too lazy to do things correctly.

于 2012-07-14T14:55:13.237 に答える
1

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

This specifically frees the compiler to do whatever is easiest or most efficient, should such a program be submitted. In general, any behavior afterwards is also undefined. In particular, it is never required that the compiler diagnose undefined behavior — therefore, programs invoking undefined behavior may appear to compile and even run without errors at first, only to fail on another system, or even on another date. When an instance of undefined behavior occurs, so far as the language specification is concerned anything could happen, maybe nothing at all.

于 2012-07-14T14:55:03.293 に答える
0

それを実現するのにオプティマイザはそれほど必要ありません。

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

のように書き換えられる.

std::cout << 10;

q現在は使用していないため、取り外し可能です。

その後、pj使用されなくなり、削除することもできます。

これはすべて、未定義の動作をプログラムに入力していないことを前提としています。コンパイラが許可されている仮定。

于 2012-07-14T15:54:59.420 に答える