私はconst_castを<>とそれが引き起こす混乱についてインターネットとStackOverflowのを探索し、私は、しかし、私はまだ疑問を持っている、便利なものを見つけました。このコードを考慮C++ constが明示的ではない場合?
は、
#include <iostream>
using namespace std;
int main(void)
{
const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;
cout << "value a="<< a << endl;
cout << "value *p=" <<*p << endl;
cout << "address a=" <<&a << endl;
cout << "address p=" <<p << endl;
}
出力は次のとおり
値A = 1つの
値* P = 2つの
アドレスA = 0x69fef8
アドレスp = 0x69fef8
私はそのようなコードのMAを見つけましたy結果はで、未定義の動作になります。
あなたはのconst性を捨てた場合:私も、この引用を見つけた
(例えばコンパイラが最適化するために、S「の
1
とS」のすべてのa
を置き換えることができ、ひいてはキャストは意味を持ちません)明示的に がconstとして宣言されていて、それを変更しようとしたオブジェクトは、結果は です。ただし、 がconstとして明示的に宣言されていないオブジェクトのconstnessをキャストすると、安全に変更できます。
と、この:C++は 変数にconst性を削除したり、追加するconst_cast
を提供
注意。しかし、constityを取り除くときには、 定数ではない参照への参照/ポインタを削除するために使用する必要があります。
int b = 1; const int a = b;
出力である:
次に、上記のコードに次の変更考慮
値a = 2
値*はP = 2
アドレス= 0x69fef4
アドレスp = 0x69fef4
私がいることを理解:int a = 1
で
a
はコンパイル時に処理され、定数式です。 int a = b
で
a
はないが、それは実行時にのみ処理することができます。
hereに記載されているように。
私の質問:
のconst宣言明示的である、とするとき、それはないですか?どのようにもともと非constなのでしょうか?
*「int a = 1」の「 'a」は、コンパイル時に処理される定数式です。そのような保証はC++ではありません。 'constexpr'変数だけがそのような保証を提供します。 – WhiZTiM
@WhiZTiMシニカルでない限り、複雑さに対する実装の定義された制限を読んで、 'constexpr'は0でなければならないので、' constexpr'は無意味です。 – nwp
いいえ、 "未定義の動作が発生する可能性があります" - "**は**未定義の動作"を持っています。 –