С учетом следующего рабочего кода (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)
- возьмет копию лямбды, которую я передаю (я думаю, это значение).
void do_work(std::function<bool(std::string)> callback)
- переместит лямбду, которую я передаю, потому что это значение.
Мое грубое представление о rvalue - любая временная переменная.
Вопросы:
Что мне не ясно на 100%, так это то, что я написал правильно? и поэтому безопасно ли использовать &&
. Оба, кажется, работают.
Этот метод &&
также работает, если вместо передачи лямбда-выражения, как это:
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));