Похоже, что если я изменю объявление с помощью __block
, оно будет работать правильно:
__block boost::function<void()> f = boost::bind(&foo);
Я до сих пор не уверен, почему это так - как упоминает @Richard в комментарии выше, это должно быть связано с «конструктором копирования const», а не «обычным конструктором копирования». Я не знаю, как проверить эту разницу, хотя; отлично работает следующее:
const boost::function<void()> f = boost::bind(&foo);
const boost::function<void()> g(f);
g();
и если это не вызывает "конструктор const copy", я не уверен, что будет.