Рассмотрим пример:
template <void (*Foo)()>
struct S {
};
int main() {
struct A {
static void x() { }
};
S<&A::x> s;
}
Код компилируется в clang, gcc утверждает, что x
не имеет привязки...
Для аналогичного примера просто при использовании лямбда-выражения:
template <void (*Foo)()>
struct S {
};
int main() {
auto lambda = []{};
S<+lambda> s;
}
Оба gcc и clang соглашаются не компилировать код: согласно gcc функция, возвращаемая unary +, не имеет привязки, состояния clang в отличие от того, что оператор-оператор в функцию не объявлен как constexpr. Есть ли какие-либо причины, чтобы запретить использование lambda cast для функции в контексте constexpr?
Найдите ниже ошибки, созданные компиляторами и живые демонстрации:
gcc:
prog.cc:7:14: error: 'main():: _ FUN' не является допустимым аргументом шаблона для типа 'void (*)()', потому что 'static constexpr void main():: _FUN() 'не имеет привязки
prog.cc:7:8: note: функция non-constexpr 'operator void (*)()' не может использоваться в постоянном выражении