Похоже, это разница в том, как bind
реализовано в MS Visual Studio (включая 2010) и GNU gcc (я тестировал 4.4.1 и 4.5.2, оба из которых работают так, как вы ожидали)
Рассмотрим следующий код, учитывая ваши определения
auto b = boost::bind(&MenuItem);
NoncopyableObject obj(7);
b(obj); // OK in VS and GCC
замена boost :: bind на std :: bind (я использую 2010, сообщение об ошибке выглядит так же, как в вашем 2008)
auto b = std::bind(&MenuItem);
NoncopyableObject obj(7);
b(obj); // compile error in VS 2010 SP1, OK in GCC
b(std::reference_wrapper<NoncopyableObject>(obj)); // OK in both
Итак, получается, что MS bind()
делает копию своего аргумента, даже если аргумент не будет использоваться, в то время как boost и GCC bind()
вообще не беспокоятся об этом аргументе.
Мне удалось получить ваш пример для компиляции и запуска (в 2010 году), изменив FUNC
typedef на
typedef boost::function1<void, std::tr1::reference_wrapper<NoncopyableObject> > FUNC;