在回答这个问题时,我用 gcc(代码编译)和 clang(代码被拒绝)尝试了以下代码:
typedef long (*func)(int);
long function(int) { return 42; }
struct Test
{
static constexpr func f = &function;
};
template<func c>
struct Call
{
static void f()
{
c(0);
}
};
int main()
{
Call<Test::f>::f();
}
我不确定哪个编译器是正确的,尽管我认为 constexpr 的初始化是Test::f
可以的。错误叮当输出是:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- 哪个编译器是正确的?
- 如果 clang 是对的,为什么,这个错误的真正含义是什么?
编辑:对于“为什么”,请参阅DyP 的问题。