为什么函数地址不是常量表达式

时间:2012-03-04 16:20:25

标签: c++ compile-time constant-expression

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

void foo()
{}

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

这不会编译。

  

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

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

2 个答案:

答案 0 :(得分:6)

绝对是编译器错误。

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

此外,上面的代码与gcc 4.6.1编译良好,虽然ideone不编译它,但是ideone使用gcc-4.5.1,它有关于你的代码的bug。

答案 1 :(得分:3)

这是我的理解,FWIW:

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

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