2016-01-20 46 views
3

我正在使用「emplace」方法來避免內存複製。 但是,當我在Lambda函數中使用「emplace」時。它總是調用隱式移動構造函數。 如何避免Lambda函數內的內存拷貝? 此示例程序不能打印「我被感動。」如何避免lambda函數內的隱式移動構造函數

#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; 
} 

回答

6

這不是lambda函數,而是關於重新分配內存中的向量。你可以用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; 
} 

Live Demo

+0

我知道了感謝。 – user5814611

相關問題