としてグローバル変数を扱う作る:あなたが見ることができるように、コンパイラがglobalBar
がconst
であると仮定するためC++:私は次のセットアップ持っている関数はconstの
Foo.cpp
class Bar {
public:
inline Bar() : x(0), y(0), z(0) {}
inline Bar(int X, int Y, int Z) : x(X), y(Y), z(Z) {}
const int x, y, z;
};
static Bar globalBar;
static void foo() {
int x = globalBar.x; // the compiler should assume globalBar is const here!
...
}
void almightySetup() {
globalBar = Bar(meaningOfLife(), complexCalc(), magic());
startThread(foo); // foo() will NEVER be called before this point!
// globalBar will NEVER be changed after this point!
}
すると、それは安全です示された点は、セットアップ後にその時点以降に変更されることはないため、globalBar
が変更されることはありません。さらに、foo()
はセットアップ前に呼び出されません。
しかし、これをどのように達成できますか?私はconst_cast<>
を使用しようとしましたが、タイプエラーメッセージを受け取り続けます。私は間違ったことをする必要があります。それも可能ですか?
私はfoo
の機能署名を自由に変更することはできません。
コンパイラは何も想定しません。コンパイラは、コードの記述に従ってコードをコンパイルします。オブジェクトが 'const'として宣言されている場合、コンパイラはそれを' const'オブジェクトと見なします。オブジェクトが 'const'として宣言されていない場合、コンパイラはそれを' const'オブジェクトと見なしません。終わり。 –
コンパイラが 'globalBar'が' foo() 'の' const'であると仮定するのはなぜ重要ですか? – Cornstalks
最適化の理由から。私はこのコードで遊ぶサイクルがほとんどありません。 – bombax