给出以下测试代码
#include <iostream>
#include <tr1/functional>
using namespace std;
struct cl {
cl(){ cout << " cl()\n"; }
cl(const cl& from){ cout << " cl()[copy]\n"; }
~cl(){ cout << " ~cl()\n";}
};
void f1(const cl& data){}
void f2(const cl* pData){}
int main(int c, char** a)
{
cout << "enter:\n";
cl data;
cout << "ref:\n";
tr1::bind(&f1, data);
cout << "ptr:\n";
tr1::bind(&f2, &data);
cout << "exit:\n";
return 0;
}
我得到以下输出:
$ g++ tr1BindDtorTest.cpp && ./a.out
enter:
cl()
ref:
cl()[copy]
cl()[copy]
cl()[copy]
~cl()
~cl()
~cl()
ptr:
exit:
~cl()
当我创建一个涉及对我的类/ struct对象的引用的绑定时,会多次创建和销毁它。
同样精确的测试,但有指针,没有这样的对象
我无法理解为什么传递值和传播之间的行为会有所不同。参考,我一直认为引用是指针的语法糖,因此推断行为应该是相同的。
有人在乎解释吗?
[g ++ 4.4.6 linux&amp; 4.2.1关于macos]
答案 0 :(得分:6)
而不是:
tr1::bind(&f1, data);
你需要这个:
tr1::bind(&f1, tr1::ref(data));
Boost有同样的事情:如果你想让绑定的函数对象存储对数据的引用,必须在boost :: bind()中使用boost :: ref()。否则,数据将始终复制到bind()生成的绑定函数对象中。
答案 1 :(得分:4)