【发布时间】:2010-10-02 23:20:12
【问题描述】:
我注意到在将引用参数传递给 boost 绑定时,这些参数不会像引用一样起作用。相反,boost 创建了成员的另一个副本,并且原始传入的变量保持不变。
当我更改对指针的引用时,一切正常。
我的问题是:
是否有可能获得对工作的引用,或者在尝试使用引用参数时至少给出编译错误?
【问题讨论】:
标签: c++ boost-bind
我注意到在将引用参数传递给 boost 绑定时,这些参数不会像引用一样起作用。相反,boost 创建了成员的另一个副本,并且原始传入的变量保持不变。
当我更改对指针的引用时,一切正常。
我的问题是:
是否有可能获得对工作的引用,或者在尝试使用引用参数时至少给出编译错误?
【问题讨论】:
标签: c++ boost-bind
boost documentation for bind 建议您可以为此使用 boost::ref 和 boost::cref。
【讨论】:
void increment_int(int& x)如果在调用int tmp = 0时不小心忘记使用boost::ref,boost::function<void()> func = boost::bind(f, tmp) --> 执行函数时,tmp不会递增。相反,boost::bind 创建的对象保存了一个副本并使用该副本调用函数increment_int。欲了解更多信息,请参阅here。我还确保创建了一个简短的、自包含的、可编译的示例来测试/验证我所说的。
每当绑定中使用的方法被声明为采用引用参数时,我遇到了类似的问题,希望通过引用传递绑定参数。然而,这种情况并非如此!无论方法如何声明,您都需要在 boost::ref() 或 boost::cref() 中显式包装绑定参数(即通过引用传递)。
例子:
ClassA myClassAParameter
void Method(ClassA ¶m);
现在,以下绑定:
callback = boost::bind(&Method, myClassAParameter);
实际上会复制 ClassA 对象(我知道这是一个临时分配,并且被调用的方法应该不保留对它的引用,因为这不是实际对象的引用,而是到对象的副本)。
但是,以下绑定:
callback = boost::bind(&Method, boost::ref(myClassAParameter));
将不会复制,而是使用引用来创建绑定对象。
【讨论】: