91257


pplx::create_taskでtask作成しています。  
データをstd::forwardで渡しているのに、コピーコンストラクタが実行されてしまいます。  
ここは通常のラムダ式であれば、ムーブコンストラクタが実行されるのですが、  
コピーコンストラクタではなく、ムーブコンストラクタが動作してほしいのですが、何か方法があるでしょうか？  
create_task内のラムダ式だとコピーコンストラクターが実行されるようです。

[code]

    #include "cpprest/http_client.h"
    #include "cpprest/filestream.h"
    
    struct Test
    {
      std::unique_ptr<int[]> data;  // データ
      int value;
    
      Test(std::unique_ptr<int[]>&& d)
        : data(std::forward<std::unique_ptr<int[]>>(d))
      {
      }
    
      Test(const Test& _obj)
      {
        ::OutputDebugStringW(L"copy\n");
      }
    
      Test(Test&& _obj) noexcept
        : data(std::forward<std::unique_ptr<int[]>>(_obj.data))
      {
        ::OutputDebugStringW(L"move\n");
      }
    };
    
    int main()
    {
      std::unique_ptr<int[]> data = std::make_unique<int[]>(10);
      Test sample(std::move(data));
      std::vector<Test> List;
      List.emplace_back(std::move(sample));
      
      pplx::create_task([
         test_c = std::forward<std::vector<Test>>(List),
       ]()
      { 
      });
    }
    
[/code]


CC BY-SA 4.0
2022-09-23T09:05:58.257
91255
2022-09-26T10:30:32.903
2022-09-26T10:30:32.903
54485
54485
question
c++
create_taskについて


[`pplx::create_task()`](https://github.com/microsoft/cpprestsdk/blob/v2.10.18/Release/include/pplx/pplxtasks.h#L4873-L4888)ですが、

[code]

    __declspec(noinline) auto create_task(_Ty _Param, task_options _TaskOptions = task_options())
        -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
    {
        ...
        task<typename details::_TaskTypeFromParam<_Ty>::_Type> _CreatedTask(_Param, _TaskOptions);
        return _CreatedTask;
    }
    
[/code]

となっているので、ラムダ式へはムーブされていますが、肝心のラムダ式 `_Param` がコピーされてるようです。  
別質問でもいろいろとされているようですが、素直に参照渡しすべきかと。  
参照渡ししていれば、ラムダ式がコピーされても参照がコピーされるだけとなります。


CC BY-SA 4.0
2022-09-23T09:40:23.327
91257
2022-09-23T09:40:23.327
4236
91255
answer