У меня есть следующий фрагмент кода, который компилируется на более раннем gcc, но не на версии 6 (работает с -std = С++ 1z). Кланг тоже отвергает это, заявляя, что объект val не имеет правильной связи. Я не понимаю разницы. Не является ли константная переменная типа указателя, который должен работать более или менее прозрачно? Есть ли что-то, что мне не хватает в синтаксисе, который позволит это работать? Или это нарушает некоторую часть стандарта?
typedef void(*t_voidfn)();
template <t_voidfn> struct s {};
void fn() {
static constexpr t_voidfn val = &fn;
s<val> x;
}
С другой стороны, это работает.
typedef void(*t_voidfn)();
template <t_voidfn> struct s {};
void fn() {
s<&fn> x;
}