したがって、クラス以外のタイプの状況では、次のようなことができます。
int val_to_check = 0;
int some_func(int param) {
assert(val_to_check == 0);
return param*param+param;
}
int main() {
printf("Val: %i\n", some_func(rand()));
return 0;
}
val_to_check
代わりにが宣言されている場合const
、アサーションはコンパイラーによって折りたたむことができます。
クラスのメンバー変数を使用して同様の定数畳み込みを取得できるかどうか知りたいです。たとえば、次のようなことができますか?
class Test {
public:
Test(int val) : val_(val) {}
int some_func(int param) {
assert(val_ == 0);
return param*param+param;
}
private:
const int val_;
};
したがって、クラスを定義するときにval_を知っている必要があります、a-la:
Test my_test(0);
printf("Val: %i\n", my_test.some_func(rand()));
(私はこれらが不自然な例であることを知っています)。アサーションを折りたたむことは時々可能であるように思われますが、私がテストした単純な例ではそれができないようです。私が得た最善の方法は、アサーションコードを関数の最後に移動することです(-O3を使用してコンパイルする場合)