tr1 :: bind&通过引用传递,这种行为真的是期待的吗?

时间:2014-02-01 06:26:03

标签: c++ tr1

给出以下测试代码

#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]

2 个答案:

答案 0 :(得分:6)

而不是:

tr1::bind(&f1, data);

你需要这个:

tr1::bind(&f1, tr1::ref(data));

Boost有同样的事情:如果你想让绑定的函数对象存储对数据的引用,必须在boost :: bind()中使用boost :: ref()。否则,数据将始终复制到bind()生成的绑定函数对象中。

答案 1 :(得分:4)

请参阅cppreference documentation

  

绑定的参数被复制或移动,并且永远不会传递   引用除非包含在std::refstd::cref中。