12

有没有办法在常量表达式中使用函数地址?

void foo()
{}

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

这不会编译。

错误 C2057:预期的常量表达式

这背后的意图是我想在编译时比较两个函数地址。

4

2 回答 2

6

这绝对是一个编译器错误。

函数可以用作模板的模板参数,这意味着它们是 const 表达式。(见ideone)。

此外,上面的代码可以很好地编译gcc 4.6.1,虽然 ideone 没有编译它,但是 ideone 使用gcc-4.5.1了与您的代码有关的错误。

于 2012-03-04T16:34:46.867 回答
3

这是我的理解,FWIW:

函数类型在编译时已知,但函数地址仅在链接时已知。因此,您可以使用函数类型作为模板参数,但地址在编译时不是常量/已知的。

在您的示例代码中,编译器可以推断出该地址在编译时是非零的,但它无法知道具体的地址。不过,这不是编译器错误。

于 2012-03-04T17:58:13.050 回答