Можно ли передать лямбда-функцию в качестве указателя функции? Если это так, я должен делать что-то неправильно, потому что получаю ошибку компиляции.
Рассмотрим следующий пример
using DecisionFn = bool(*)();
class Decide
{
public:
Decide(DecisionFn dec) : _dec{dec} {}
private:
DecisionFn _dec;
};
int main()
{
int x = 5;
Decide greaterThanThree{ [x](){ return x > 3; } };
return 0;
}
Когда я попытаюсь скомпилировать этот файл, я получаю следующую ошибку компиляции:
In function 'int main()':
17:31: error: the value of 'x' is not usable in a constant expression
16:9: note: 'int x' is not const
17:53: error: no matching function for call to 'Decide::Decide(<brace-enclosed initializer list>)'
17:53: note: candidates are:
9:5: note: Decide::Decide(DecisionFn)
9:5: note: no known conversion for argument 1 from 'main()::<lambda()>' to 'DecisionFn {aka bool (*)()}'
6:7: note: constexpr Decide::Decide(const Decide&)
6:7: note: no known conversion for argument 1 from 'main()::<lambda()>' to 'const Decide&'
6:7: note: constexpr Decide::Decide(Decide&&)
6:7: note: no known conversion for argument 1 from 'main()::<lambda()>' to 'Decide&&'
Это чертовски сообщение об ошибке для переваривания, но я думаю, что я получаю от него то, что лямбда нельзя рассматривать как constexpr
, поэтому я не могу передать ее как указатель на функцию? Я попытался сделать x
const, но это, похоже, не помогает.