Intereting Posts
g ++ linker: /usr/lib/libGL.so.1: не удалось прочитать символы: Неверная операция Как использовать этот макрос для проверки совместимости памяти? Последствия использования амперсанда перед именем функции в C ++? Странное поведение при назначении символа переменной int Определенные пользователем литералы не являются constexpr? В чем разница между boost :: io_service poll_one и run_one? Использование заголовков C в коде C ++ в GNU. Ошибка, включая встроенную сборку: невозможное ограничение в ‘asm’ Смешивание C и C ++ в CMake, что CMakeCCompilerId.c и как я могу его отбросить Может ли неименованный параметр функции иметь значение по умолчанию? Как использовать стандартные интеллектуальные указатели C ++ с Windows HANDLE? Могу ли я использовать библиотеку boost для выполнения кроссплатформенного приложения? Безопасность streamа std :: random_device Объявление массива внутри classа и установка его размера с помощью конструктора C-callback к шаблону функции: явно создайте шаблон Класс C ++ 11 с объединением строки и shared_ptr

Когда значение boost :: bind приводит к заданному типу?

Когда я использую boost :: bind для привязки параметров к функции – когда они передаются в тип, требуемый функцией (если возможно неявное литье)?

Как они сохраняются в объекте bind_t? Как тип, первоначально переданный для связывания или как тип, требуемый подписи функции?

В частности:

Если у меня есть функция подписи

void SomeFun(SmartPointer) 

и я использую bind как

 boost::bind(&SomeFun, somePtr) 

где somePtr имеет тип SomeType* , будет bind_t объект bind_t содержать копию некоторого somePtr сохраненного как простой указатель, или он будет SmartPointer в SmartPointer и сохранен как SmartPointer ?

Существует неявный SomeType* из SomeType* в SmartPointer . В отличие от boost::shared_ptr этот SmartPointer использует контрольный счетчик в управляемых объектах, то есть SomeType должен быть получен из SmartPointed .

Это не будет работать, так как не существует неявного преобразования или неявного конструктора для shared_ptr из SomeType *.

Вы должны позвонить

 boost::bind(&SomeFun, boost::shared_ptr(somePtr)) 

если somePtr – это указатель, который вы только что выделили «новым», и ожидаете, что его удалят позже, когда последняя ссылка shared_ptr выходит за frameworks. Если вы не хотите, чтобы указатель был удален, но вы знаете, что он все равно будет действителен во время вызова, а функция должна принять shared_ptr, вы можете использовать no-op deleter для создания shared_ptr. В любом случае, это shared_ptr, а не указатель или weak_ptr или что-то еще, что вы должны пройти в этом экземпляре.

Вы говорите, что ваше дело по-другому, поэтому нам нужно будет увидеть ваш фактический случай или тот, который соответствует ему ближе.

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

Это просто потому, что существуют разные перегрузки для boost :: bind для всех этих функций, когда функция является функцией classа.

Если преобразование является неявным, неявное преобразование произойдет в момент вызова функции. boost :: bind – это просто шаблон, который хранит то, что передается в него. Некоторая магия будет иметь место с первым параметром, если она используется для вызова функции-члена.

Обратите внимание, что иногда boost :: bind будет хранить boost :: ref, где функция фактически принимает ссылку.

Они сохраняются как тип, который был передан.

Преобразование произойдет, когда вы вызываете объект функции, возвращаемый bind, а не когда вы выполняете привязку.

Если конструктор shared_ptr НЕ был помечен как явный:

 template explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete 

то вы попали бы в интересную ошибку, учитывая такое поведение boost :: bind. Если вы вызвали функтор только один раз, тогда все будет хорошо, и ваш объект будет удален. Если вы вызвали его несколько раз, тогда у вас была бы двойная бесплатная и беспорядочная ошибка, так как во второй раз, когда вы создали shared_ptr из вашего указателя, вы бы использовали указатель, который уже был освобожден.

(Я просто задал вопрос о том, почему boost :: bind реализуется таким образом)