What is the lifetime of a C++ lambda expression?

前端 未结 4 917
长发绾君心
长发绾君心 2020-12-01 02:04

(I have read What is the lifetime of lambda-derived implicit functors in C++? already and it does not answer this question.)

I understand that C++ lambda syntax is j

4条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-01 02:19

    It seems you're more confused about std::function than lambdas.

    std::function uses a technique called type-erasure. Here's a quick fly by.

    class Base
    {
      virtual ~Base() {}
      virtual int call( float ) =0;
    };
    
    template< typename T>
    class Eraser : public Base
    {
    public:
       Eraser( T t ) : m_t(t) { }
       virtual int call( float f ) override { return m_t(f); }
    private:
       T m_t;
    };
    
    class Erased
    {
    public:
       template
       Erased( T t ) : m_erased( new Eraser(t) ) { }
    
       int do_call( float f )
       {
          return m_erased->call( f );
       }
    private:
       Base* m_erased;
    };
    

    Why would you want to erase the type? Isn't the type we want just int (*)(float)?

    What the type erasure allows is Erased can now store any value that is callable like int(float).

    int boring( float f);
    short interesting( double d );
    struct Powerful
    {
       int operator() ( float );
    };
    
    Erased e_boring( &boring );
    Erased e_interesting( &interesting );
    Erased e_powerful( Powerful() );
    Erased e_useful( []( float f ) { return 42; } );
    

提交回复
热议问题