91250


以下のような場合、ラムダ式でPerfect Forwardキャプチャしたいのですがうまくいきません。  
元のデータが使用できなくなってもよいのでラムダ内に完全転送したいのですが。

dataが大きなサイズのデータになり、ラムダ内で使用したら使い終わるため、  
コピーをしてラムダ内と外で2つメモリを同時に存在させたくないのが目的です。  
※ラムダの&参照は使用できません。

[code]

    struct Test
    {
      std::unique_ptr<int[]> data; // データ
      int value;
    
      Test(std::unique_ptr<int[]>&& d)
        : data(std::forward<std::unique_ptr<int[]>>(d))
        , value(10)
      {
      }
    };
    
    int main()
    {
      int size = 10;
      std::unique_ptr<int[]> data = std::make_unique<int[]>(size);
      data[0] = 123;
    
      Test sample(std::move(data));
    
      // ラムダ式
      auto func = [test_c = std::forward(sample), size] <---うまくいかない
      { 
        int sum = 0;
        for (int i = 0; i < size; i++)
        {
          sum += test_c.data[i];
        }
        return;
      };
      func();
    }
    
[/code]


CC BY-SA 4.0
2022-09-23T00:16:54.747
91245
2022-09-26T02:19:43.880
2022-09-23T00:21:46.353
54485
54485
question
c++
ラムダ式でForwardキャプチャしたい。


[`std::forward()`](https://cpprefjp.github.io/reference/utility/forward.html)は型引数が必要です。

[code]

    auto func = [test_c = std::forward<Test>(sample), size]
    
[/code]

でどうでしょうか？


CC BY-SA 4.0
2022-09-23T05:02:14.290
91250
2022-09-23T05:02:14.290
4236
91245
answer


> ラムダ式でPerfect Forwardキャプチャしたいのですがうまくいきません。

質問用にソースコードを簡約する過程で変形されたためかもしれませんが、質問文中のソースコードに対しては「Perfect
Forward／`std::forward`」を使う必然性がない旨を指摘しておきます。

`std::forward<T>(t)`が必要となるのは（字義通り）関数テンプレート引数の "Perfect Forward" のためであり、`T`には
**関数テンプレートのテンプレートパラメータを指定する**
ことが一般的な利用方法です。テンプレートパラメータに依存しない具体的な型を指定するユースケースは考えにくく、このようなケースでは単なるコピー（式`t`）またはムーブ（式`std::move(t)`）のいずれかをプログラマ自身の判断で記述すべきです。

* * *
[code]

    Test(std::unique_ptr<int[]>&& d)
      : data(std::forward<std::unique_ptr<int[]>>(d))
    
[/code]

`Test`コンストラクタ中の`std::forward<std::unique_ptr<int[]>>(d)`は、常に`std::move(d)`と等価です。

[code]

    // (修正後コード)
    auto func = [test_c = std::forward<Test>(sample), size]
    
[/code]

main関数中のラムダ式初期化キャプチャ`test_c = std::forward<Test>(sample)`は、常に`test_c =
std::move(sample)`と等価です。


CC BY-SA 4.0
2022-09-26T02:19:43.880
91303
2022-09-26T02:19:43.880
49
91245
answer