boost :: bind с функциями, параметры которых являются ссылками

Я заметил, что при передаче ссылочных параметров для усиления привязки эти параметры не будут действовать как ссылки. Вместо этого boost создает еще одну копию члена, а исходная переданная переменная остается неизменной.

Когда я меняю ссылки на указатели, все работает нормально.

У меня вопрос:

Можно ли получить ссылки на работу или хотя бы выдать ошибку компиляции при попытке использовать ссылочные параметры?


person Brian R. Bondy    schedule 22.01.2009    source источник


Ответы (2)


boost документация для привязки предполагает, что вы можете используйте для этого boost :: ref и boost :: cref.

person Timo Geusch    schedule 22.01.2009
comment
например void increment_int(int& x), если вы случайно забыли использовать boost::ref при вызове int tmp = 0, boost::function<void()> func = boost::bind(f, tmp) - ›при выполнении функции, tmp не будет увеличиваться. Вместо этого объект, созданный boost::bind, сохраняет копию и вызывает функцию increment_int с копией. для получения дополнительной информации см. здесь. Я также позаботился о том, чтобы создать короткий, самодостаточный, компилируемый пример, чтобы проверить / проверить то, что я сказал. - person Trevor Boyd Smith; 05.07.2016

Я столкнулся с аналогичной проблемой, ожидая, что параметр привязки будет передан по ссылке всякий раз, когда метод, используемый в привязке, был объявлен как принимающий параметр ссылки. Тем не менее, это не так! Вам нужно будет явно заключить параметр привязки (который должен передаваться по ссылке) в boost :: ref () или boost :: cref () независимо от того, как объявлен метод.

Пример:

ClassA myClassAParameter
void Method(ClassA &param);

теперь следующая привязка:

callback = boost::bind(&Method, myClassAParameter);

фактически сделает КОПИЮ объекта ClassA (что, как я понимаю, это временное выделение, и вызываемый метод не должен сохранять ссылку на него, поскольку это ссылка не на фактический объект, а на копию объекта).

однако следующая привязка:

callback = boost::bind(&Method, boost::ref(myClassAParameter));

не будет делать копию, но будет использовать ссылку для создания объекта привязки.

person DolphinDream    schedule 13.01.2014
comment
Спасибо! Я использую boost :: asio Timer.5 для обучения. И хотите сделать общие параметры передачи печати. - person kometen; 24.01.2016