Почему std :: bind () пытается скопировать мой объект? - PullRequest
1 голос
/ 01 мая 2011

Я использую 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 ]

8 голосов
/ 01 мая 2011
  1. Это поведение по умолчанию.
  2. Чтобы перейти по ссылке, попробуйте использовать std :: ref.
3 голосов
/ 01 мая 2011

Чтобы избежать копирования, передайте 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 с указателями на члены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...