【发布时间】:2020-10-16 20:27:38
【问题描述】:
当从一个 lambda 移动构造 std::function 对象时,该 lambda 具有按值捕获,看起来被 值捕获的对象的移动构造函数 被调用了两次。考虑
#include #include结构 Foo { 整数值 = 1; Foo() = 默认值; Foo(const Foo &) {} 富(富 &&) { std::cout func(std::move(lambda)); std::cout 输出是
--------- move ctor move ctor ---------我在 Mac OS X Catalina 上工作,我的编译器是
g++-9 (Homebrew GCC 9.3.0) 9.3.0我用
g++ -std=c++17编译。我猜这种行为可能有点依赖于编译器实现,但我仍然对这种机制感到好奇。
谁能解释一下为什么移动构造函数被调用了两次以及那里到底发生了什么?
【问题讨论】:
-
std::thread和绑定参数类似:stackoverflow.com/questions/59601840/… -
@dfri 我不这么认为。这里的按值捕获只涉及复制构造函数。
-
@underscore_d 这是一个非常不同的情况,因为
std::therad的构造函数通过(转发)引用传递它的参数,而std::function的构造函数传递它的参数按价值。
标签: c++ lambda c++17 move-semantics std-function