мы должны иметь возможность использовать его в качестве параметра шаблона.
аяКак мне написать лямбда-выражение, которое выглядит как метод?Я попытался превратить безвоздушную лямбду в указатель на функцию-член, используя тот факт, что, начиная с C ++ 17, безвоздушные лямбда-выражения имеютconstexpr оператор преобразования в их тип указателя функции.
Поэтому я решил проблему, которая сводится к следующему:
template<void(*)()> struct A{};
int main()
{
A<static_cast<void(*)()>([]{})>{}; // 1
constexpr auto fp = static_cast<void(*)()>([]{});
A<fp>{}; // 2
}
Теперь это компилируется в clang (начиная с 5.0.0), но gcc (> = 7.2) жалуется:
error: lambda-expression in template-argument
A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
A<fp>{}; // 2
Вопрос в том,кто прав?