Отвечая на этот вопрос, я попробовал следующий код с 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 прав, почему и что означает эта ошибка?
EDIT: для "почему", см. вопрос DyP.
