我有以下(人为的)代码,其中我有一个带有单个打印函数的打印机类和一个处理字符串然后调用打印函数的回调函数的工作类:
#include <functional>
#include <iostream>
using callback_fn = std::function<bool(std::string)>;
class printer
{
public:
bool print(std::string data)
{
std::cout << data << std::endl;
return true;
}
};
class worker
{
public:
callback_fn m_callback;
void set_callback(callback_fn callback)
{
m_callback = std::move(callback); // <-- 1. callback is a temp, so what does std::move do here?
}
void process_data(std::string data)
{
if (!m_callback(data)) { /* do error handling */ }
}
};
int main() {
printer p;
worker w;
w.set_callback( std::move([&](std::string s){ return p.print(s); }) ); // <-- 2. what does std::move do here?
w.process_data("hello world2");
}
注意:我已经std:: move()
打过两次电话了……现在这行得通(令我惊讶),但我两者都只是为了展示我正在尝试的内容。我的问题是:
- 我应该
std::move()
在set_callback()
函数中使用来“拉”出温度,如果我使用它,真的有一个副本还是std:: move(
) 意味着它不是真正的副本? - 我应该
std:: move()
用来传递 lambda 吗……这是否正确。 - 我想我不明白为什么这段代码适用于两个
std:: moves()
......这意味着我仍然不明白std:: move()
在做什么 - 所以如果有人能告诉我这里发生了什么,那就太好了! - 我知道我可以按值传递,但我的目标是移动 temp 以便我没有它的副本。这就是完美转发的意思吗?
我的示例可以在 wandbox 中看到:https ://wandbox.org/permlink/rJDudtg602Ybhnzi
更新 我尝试使用 std::move 的原因是为了避免复制 lambda。(我认为这称为转发/完美转发)......但我认为我正在对其进行哈希处理!