使用lambda调用的Move构造函数
Move constructor called with lambda
我正在努力深入了解lambdas在C++中是如何工作的。我已经编写了以下代码。
#include <iostream>
#include <functional>
struct A
{
A() { std::cout << "A" << (data = ++count) << ' '; }
A(const A& a) { std::cout << "cA" << (data = a.data + 20) << ' '; }
A(A&& a) { std::cout << "mA" << (data = std::move(a.data) + 10) << ' '; }
~A() { std::cout << "dA" << data << ' '; }
int data;
static int count;
};
int A::count = 0;
void f(A& a, std::function<void(A)> f)
{
std::cout << "( ";
f(a);
std::cout << ") ";
}
int main()
{
A temp, x;
auto fun = [=](A a) {std::cout << a.data << '|' << x.data << ' ';};
std::cout << "| ";
f(temp, fun);
std::cout << "| ";
}
输出如下。
A1 A2 cA22|cA42 mA52 dA42(cA21 mA31 31|52 dA31 dA21)dA52|dA22 dA2 dA1
这一点我很清楚,除了'mA52'移动构造函数调用。请注意,我使用的是按值捕获变量,因此如果没有move构造函数,这里将调用copy构造函数。为什么在这一步需要额外的复制/移动?当fun
作为参数通过值传递给f
时,可以期望对象只复制一次。此外,对象的第一个副本会立即销毁。为什么?这个中间副本是什么?
让我们调用您的lambda类型L
。它是未命名的,但在没有名字的情况下提及它会让人感到困惑。
构造函数std::function<void(A)>(L l)
按值取L
。这涉及到创建原始fun
的副本。
然后,构造函数将lambda从l
移动到由std::function<void(A)>
包装器管理的某个存储中。此举还涉及移动任何被捕获的实体。
std::function<void(A)>
按值获取传递给它的函数对象(这是输出中的cA42)。然后,它将功能对象移入其内部存储器(这就是mA52)。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- std::映射,只有move构造函数可用
- 为什么我的代码中没有调用move构造函数
- std::转换move构造函数的模板专业化的变体
- 如何调用move构造函数
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 为什么noexcept move构造函数在向量重新分配期间没有被调用
- 为什么在声明析构函数时必须声明 copy & move 构造函数?
- 如何在我自己的类 Vector 中使用 Move 构造函数而不是 Move 赋值运算符
- GoogleTest Move 构造函数覆盖率
- C - 构造函数,复制构造函数,MOVE构造函数,驱动器
- 如何在基类中调用 "move" '&&' 构造函数?在C++
- 如果我有一个向量(或类似的东西)成员变量,那么move构造函数看起来怎么样
- std::vector的move构造函数是否调用项的move构造器
- 为什么我们需要在move构造函数中将右值引用设置为null
- move构造函数在C++中调用了两次吗
- 实现move构造函数如何影响返回值优化
- 不能默认使用Move构造函数
- C++合成的move构造函数如何受到volatile和虚拟成员的影响