En passant de la capture lambda comme pointeur de fonction

Est-il possible de passer d'une fonction lambda comme un pointeur de fonction? Si oui, je dois être en train de faire quelque chose incorrecte parce que je suis une erreur de compilation.

Considérons l'exemple suivant

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;
}

Quand je essayez de compiler ce, j'obtiens l'erreur de compilation suivante:

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&&'

C'est un diable d'un message d'erreur à digérer, mais je pense que ce que je suis en sortir, c'est que le lambda ne peut pas être traité comme un constexpr donc je ne peut pas passer comme un pointeur de fonction? J'ai essayé de faire x const ainsi, mais cela ne semble pas aider.

lambda peut se désintègrent en pointeur de fonction que s'ils ne captent rien.
blogs.msdn.com/b/oldnewthing/archive/2015/02/20/10594680.aspx

OriginalL'auteur CoryKramer | 2015-02-26