Capture and move a unique_ptr in a c++14 lambda expression

后端 未结 3 908
夕颜
夕颜 2021-02-01 01:44

I am capturing a unique_ptr in a lambda expression this way:

auto str = make_unique(\"my string\");
auto lambda = [ capturedStr = std::move(str)          


        
3条回答
  •  猫巷女王i
    2021-02-01 02:22

    auto lambda = [ capturedStr = std::move(str) ] {
       cout << *capturedStr.get() << endl;
       auto str2 = std::move(capturedStr); // <--- Not working, why?
    };
    

    To give more detail the compiler is effectively making this transformation:

    class NameUpToCompiler
    {
        unique_ptr capturedStr;  // initialized from move assignment in lambda capture expression
    
        void operator()() const
        {
            cout << *capturedStr.get() << endl;
            auto str2 = std::move(capturedStr);  // move will alter member 'captureStr' but can't because of const member function.
        }
    }
    

    The use of mutable on the lambda will remove the const from the operator() member function therefore allowing the members to be altered.

提交回复
热议问题