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

C++ tr1::bind&;通过引用传递,这种行为真的是预期的吗?,c++,tr1,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(c

给定以下测试代码

#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++4.4.6 linux和macos上的4.2.1]

而不是:

tr1::bind(&f1, data);
你需要这个:

tr1::bind(&f1, tr1::ref(data));
Boost也有同样的功能:如果希望绑定的函数对象存储对数据的引用,那么Boost::ref()必须在Boost::bind()中使用。否则,数据将始终复制到bind()生成的绑定函数对象中。

请参阅:

要绑定的参数被复制或移动,并且永远不会被传递 参考,除非包装在或中


+1谢谢!当参数声明为常量时,如果我使用ref而不是cref,它为什么不抱怨呢?当需要常量引用时,传递一个非常量引用是非常好的。你能详细说明一下这个细节吗?它是否像一个指向常量指针的非常量指针?如果是这样,为什么要同时使用
ref()
cref()
呢?如果你有一个const对象,你就不能在它上面使用ref()。但是您可以使用cref(),然后就可以通过ref方法调用const。如果使用cref(),将无法调用非const by ref方法。
tr1::bind(&f1, tr1::ref(data));