有没有一种方法可以在常量表达式中使用函数地址?
void foo()
{}
int main()
{
static_assert(&foo, "test error");
}
这段代码无法编译。
错误:C2057: 预期常量表达式。
代码的目的是在编译时比较两个函数地址。
有没有一种方法可以在常量表达式中使用函数地址?
void foo()
{}
int main()
{
static_assert(&foo, "test error");
}
这段代码无法编译。
错误:C2057: 预期常量表达式。
代码的目的是在编译时比较两个函数地址。
这绝对是编译器的一个bug。
函数可以作为模板参数,这意味着它们是const表达式。(参见ideone)。
此外,上面的代码在gcc 4.6.1
下可以编译通过,尽管ideone无法编译它,但是ideone使用的是gcc-4.5.1
,该版本存在与您的代码相关的错误。
&foo
在编译时的预期结果是什么?(我并不是说它不能被完成,但这个表达式被认为是odr-use,所以编译器可以假设它必须被定义,并让链接器解析地址,如果没有定义,则会失败。但是,我建议去标准文件中寻找权威答案来回答这个问题。 - David Rodríguez - dribeas&foo
,直到程序运行。 - David Heffernan