statischer constexpr Zeiger auf Funktion, Unterschied zwischen Compilern

Bei der Beantwortungdiese FrageIch habe den folgenden Code mit gcc ausprobiert (Code kompiliert) und clang (Code abgelehnt):

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();
}

Ich bin nicht sicher, welcher Compiler richtig ist, obwohl ich die constexpr-Initialisierung von denkeTest::f ist in Ordnung. Die Fehlermeldungen lauten:

error: non-type template argument for template parameter of pointer type 'func'
       (aka 'long (*)(int)') must have its address taken
Welcher Compiler ist richtig?Wenn clang richtig ist, warum und was bedeutet dieser Fehler wirklich?

BEARBEITEN: für das "Warum", sieheDyP's Frage.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage