Если вы передадите функцию в конструктор по ссылке и не сделаете ее копию, вам не повезет, когда функция выйдет за пределы этого объекта, так как ссылка больше не будетбыть действительным.Об этом уже говорилось в предыдущих ответах.
Я хотел бы добавить, что вместо этого вы можете передать функцию в значение , а не ссылку, в конструктор.Зачем?ну, в любом случае, вам нужна его копия, поэтому, если вы передадите по значению, компилятор может оптимизировать необходимость делать копию, когда передается временное (например, лямбда-выражение, записанное на месте).
Конечно, как бы вы ни делали, вы потенциально можете сделать еще одну копию, когда назначаете переданную функцию переменной, поэтому используйте std::move
, чтобы удалить эту копию.Пример:
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
MyClass (Myfunction myFunction): m_myfunction(std::move(myFunction))
{}
private:
MyFunction m_myFunction;
};
Таким образом, если они передают значение, указанное выше, компилятор оптимизирует первую копию в конструкторе, а std :: move удаляет вторую:)
Если ваш (единственный) конструктор принимает константную ссылку, вам потребуется сделать копию этого в функции независимо от того, как она передана.
Альтернатива - определить два конструктора, чтобы иметь дело с lvalues и rvalues отдельно:
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
//takes lvalue and copy constructs to local var:
MyClass (const Myfunction & myFunction): m_myfunction(myFunction)
{}
//takes rvalue and move constructs local var:
MyClass (MyFunction && myFunction): m_myFunction(std::move(myFunction))
{}
private:
MyFunction m_myFunction;
};
Теперь вы обрабатываете rvalue по-разному и устраняете необходимость копирования в этом случае, явно обрабатывая его (вместо того, чтобы компилятор обрабатывал его для вас).Может быть незначительно более эффективным, чем первый, но также более сложным.
Соответствующая ссылка (и, вероятно, довольно неплохо здесь) (* очень хорошее чтение): http://cpp -next.com/ Архив / 2009/08 / хотите-скорость-передача по значению /