Подтвердить что ты не робот

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

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

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

Мой вопрос:

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

4b9b3361

Ответ 1

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

Ответ 2

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

Пример:

ClassA myClassAParameter
void Method(ClassA &param);

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

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

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

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

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

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