我理解的std::function
的典型用法是:
#include <iostream>
#include <functional>
using namespace std;
class C {
public:
C() { cout << "CREATING" << endl; }
C(const C&) { cout << "COPY C "<< endl; };
C(C&&) { cout << "MOVE C " << endl; };
~C() { cout << "DELETING"<< endl; }
C& operator =(const C&) {
cout << "COPY A " << endl; return *this;
};
C& operator =(C&&) {
cout << "MOVE A" << endl; return *this;
};
void operator ()() const { cout << "CALLING" << endl; }
};
int main(int argc, char *argv[]) {
function<void()> f = C();
f();
return 0;
}
产生以下输出
CREATING
MOVE C
DELETING
CALLING
DELETING
显然,临时对象被创建在堆栈上,然后移动到函数对象中。如果没有提供移动构造函数,则会进行复制。
有没有一种标准的方法可以在不需要临时对象的情况下设置目标?
std::function
可能已经分配了内存,因此假设共享指针足够小,使得std::function
利用其小对象优化,我们可以在自由存储器上创建函数对象,而不会增加额外的成本。 - 5gon12eder