【发布时间】:2018-08-29 10:30:09
【问题描述】:
给定以下工作代码(main.cpp):
#include <functional>
#include <iostream>
struct worker
{
std::function<bool(std::string)> m_callback;
void do_work(std::function<bool(std::string)> callback) // <--- this line
{
m_callback = std::bind(callback, std::placeholders::_1);
callback("hello world!\n");
}
};
// pretty boring class - a cut down of my actual class
struct helper
{
worker the_worker;
bool work_callback(std::string str)
{
std::cout << str << std::endl;
return false;
}
};
int main()
{
helper the_helper;
the_helper.the_worker.do_work( [&](std::string data){ return the_helper.work_callback(data); });
}
编译:-std=c++11 -O2 -Wall -Wextra -pedantic-errors -O2 main.cpp
我已经评论了有问题的行(<-- this line - 第 7 行附近),我认为在其中使用会更有效:void do_work(std::function<bool(std::string)>&& callback) 即使用 && 移动语义。
我从来没有真正使用过这个,主要是因为我还不太了解它。
我的理解是这样的:
void do_work(std::function<bool(std::string)> callback) - 将获取我传入的 lambda 的副本(我认为这是一个右值)。
void do_work(std::function<bool(std::string)> callback) - 将移动我传入的 lambda,因为它是一个右值。
我对右值的粗略想法是任何临时变量。
问题:
我不是 100% 清楚的是,我写的是正确的吗?因此使用
&&是否安全。两者似乎都有效。如果不是像这样传递 lambda,这个
&&方法是否也有效:
the_helper.the_worker.do_work( [&](std::string data){ return the_helper.work_callback(data); });
我们传入 std::bind(...):
the_worker.do_work(std::bind(&helper::work_callback, the_helper, std::placeholders::_1));
【问题讨论】:
-
您不需要
std::bind调用,只需分配m_callback = callback; -
@Someprogrammerdude 我知道 - 你必须原谅这个糟糕的例子! (很难做一个简单的例子来展示一个点而不做废话)......但我确实想以这种方式传递和存储回调(即使用 lambda 或绑定)。我只是真的想专注于传递类型(即按值或按
&&)。
标签: c++ c++11 move-semantics rvalue-reference