为什么std :: bind()会尝试复制我的对象?

时间:2011-05-01 18:18:46

标签: c++ stl

我正在使用VS2010。 在我的不可兼容的Scene类的构造函数中,我有:

auto& character_mgr = CharacterManager::Instance();
    character_mgr.initialize();
character_mgr.add_observer(  std::bind( &Scene::on_character_event, *this, std::placeholders::_1, std::placeholders::_2 ) );

这里add_observer定义为:

void add_observer( Observer observer ){ ... }

将Observer定义为:

typedef std::function< void ( CharacterEvent, const Character& ) > Observer;

问题是编译器告诉我有一次尝试复制我的场景,我使用*this在绑定中提供,认为它会保留对它的引用,而不是在复制时复制它绑定生成的仿函数。

  1. 为什么要尝试复制我的对象?这是正常的吗?
  2. 如何在提供对象的成员函数时避免复制?

2 个答案:

答案 0 :(得分:8)

  1. 这是默认行为。
  2. 要通过引用传递,请尝试使用std :: ref。

答案 1 :(得分:3)

为避免复制,请传递this代替*this,或作为另一个答案std::ref(*this)传递。

character_mgr.add_observer(  std::bind( &Scene::on_character_event, this, std::placeholders::_1, std::placeholders::_2 ) );

看看U sing bind with pointers to members