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.