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

coo*_*451 12 c++ compile-time constant-expression

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

void foo()
{}

int main()
{
  static_assert(&foo, "test error");
}
Run Code Online (Sandbox Code Playgroud)

这不会编译.

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

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

Naw*_*waz 6

它绝对是一个编译器错误.

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

此外,上面的代码编译很好gcc 4.6.1,虽然ideone不编译它,但ideone使用gcc-4.5.1哪个有关于您的代码的错误.

  • 我认为这可能有点棘手.函数地址的一个问题是编译器不一定*知道它的值(它可能在不同的转换单元中定义或者根本没有定义.`&foo的预期结果是什么(在*编译时*) `对于那些情况?(我不是说不能这样做,那个表达式被认为是*odr-use*,所以编译器可以假定它必须被定义并让链接器解析地址失败,如果没有定义,但是我会按照标准来获得问题的权威答案. (4认同)
  • 函数在编译时是已知的,但它们的地址不是.编译时使用符号名称,以便链接器稍后进行内存映射.为了进一步复杂化,在C++中引入模板之后,链接器几乎普遍开始折叠具有相同编译代码的函数.所以**两个不同的函数在运行时可能具有相同的地址**.预计编译器不会知道这一点. (3认同)