boost :: bind с функциями, имеющими параметры, которые являются ссылками - PullRequest
29 голосов
/ 22 января 2009

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

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

Мой вопрос:

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

Ответы [ 2 ]

36 голосов
/ 22 января 2009

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

7 голосов
/ 13 января 2014

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

Пример:

ClassA myClassAParameter
void Method(ClassA &param);

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

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

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

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

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

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

...