12

定数式で関数アドレスを使用する方法はありますか?

void foo()
{}

int main()
{
  static_assert(&foo, "test error");
}

これはコンパイルされません。

エラー C2057: 定数式が必要です

この背後にある意図は、コンパイル時に 2 つの関数アドレスを比較したいということです。

4

2 に答える 2

6

これは間違いなくコンパイラのバグです。

関数はテンプレートのテンプレート引数として使用できます。つまり、関数は const 式です。(イデオンを参照)。

また、上記のコードはgcc 4.6.1で正常にコンパイルされますが、ideone ではコンパイルされませんがgcc-4.5.1、コードに関してバグのある ideone が使用されます。

于 2012-03-04T16:34:46.867 に答える
3

これは私の理解です、FWIW:

関数はコンパイル時に認識されますが、関数アドレスはリンク時にのみ認識されます。したがって、関数型をテンプレートパラメータとして使用できますが、アドレスはコンパイル時に定数/既知ではありません。

サンプルコードでは、コンパイラはコンパイル時にアドレスがゼロ以外であると推測できますが、その場合、特定のアドレスを知ることはできません。ただし、これはコンパイラのバグではありません。

于 2012-03-04T17:58:13.050 に答える