When answering this question, I tried the following code with gcc (code compiled) and clang (code rejected):
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();
}
I am not sure which compiler is right, although I think the constexpr initialization of Test::f is ok. The error clang outputs is:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- Which compiler is right ?
- If clang is right, why , and what does this error really means ?
EDIT: for the "why", see DyP's question.
&functionis actually a valid initializer forconstexpr. Both compilers seem to think so. But it seems iffy to me. That isn't known at compile time, only at link time.&functionis the address of a function, so for me it is known at compile time... For example, you can pass a pointer to function as a template argument.constexpr?