3

メモリコピーを避けるために「emplace」メソッドを使用しています。しかし、Lambda 関数内で「emplace」を使用している場合。常に暗黙的な移動コンストラクターを呼び出します。Lambda 関数内でメモリコピーを回避するにはどうすればよいですか? このサンプル プログラムでは、「移動中です」と出力しないでください。</p>

#include <vector>
#include <iostream>

struct A
{
    int a;

    A(int t) : a(t)
    {
        std::cout << "I am being constructed.\n";
    }
    A(A&& other) : a(std::move(other.a))
    {
        std::cout << "I am being moved.\n";
    }
};

std::vector<A> g_a;

int main()
{
    std::cout << "emplace_back:\n";
    g_a.emplace_back(1);

    std::cout << "emplace_back in lambda:\n";
    auto f1 = [](int x) { g_a.emplace_back(x);  };  
    f1(2);

    std::cout << "\nContents: ";
    for (A const& t : g_a) 
        std::cout << t.a << " ";
    std::cout << std::endl;
}
4

1 に答える 1

6

ラムダ関数についてではなく、メモリを再割り当てするベクトルについてです。で修正できますstd::vector::reserve

int main() {
    g_a.reserve(10);
    ^^^^^^^^^^^^^^^^
    std::cout << "emplace_back:\n";
    g_a.emplace_back(1);

    std::cout << "emplace_back in lambda:\n";
    auto f1 = [](int x) { g_a.emplace_back(x);  };  
    f1(2);

    std::cout << "\nContents: ";
    for (A const& t : g_a) 
        std::cout << t.a << " ";
    std::cout << std::endl;
}

ライブデモ

于 2016-01-20T09:01:01.917 に答える