如何避免 lambda 函数中的隐式移动构造函数
How Can I avoid implicit move constructor inside a lambda function
我正在使用"emplace"方法来避免内存复制。但是,当我在 Lambda 函数中使用"emplace"时。它总是调用隐式移动构造函数。如何避免 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;
}
这不是关于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;
}
现场演示
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 移动构造函数和右值引用
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- C++:为什么不调用移动构造函数?
- 移动构造函数永远不会被调用
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 运算符+ 的规范实现涉及额外的移动构造函数
- C ++为什么在移动构造函数中需要移动/前进
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 为什么这里不调用移动构造函数?
- 隐式移动构造函数
- 如何为具有私有成员的派生类实现移动构造函数
- 为什么不调用移动构造函数
- 是否可以避免在以下代码中复制/移动构造函数的需要?