boost::bind не работает в VC++ 2010 при привязке функции, которая генерирует исключения

У меня есть код, который отлично компилируется под Linux, но я пытаюсь перенести его на Windows. Я использовал предварительно скомпилированные двоичные файлы Boost 1.50 из Boost Pro, но когда я компилирую свой код, я получаю эту загадочную ошибку:

error C2664: 'boost::_bi::bind_t<R,F,L>::bind_t(const boost::_bi::bind_t<R,F,L> &)' :
   cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>'
   to 'const boost::_bi::bind_t<R,F,L> &'
   C:\Program Files (x86)\boost\boost_1_50\boost\bind\bind_cc.hpp   [line] 50

Ошибка наиболее бесполезна, потому что она проявляется глубоко в файлах заголовков Boost, без указания того, где в моем коде проблема. Тем не менее, комментируя различные блоки кода, я сузил его до этой причины:

void test(int a)
    throw (int)   // removing this line makes it compile
{
    return;
}
...
boost::function<void(int)> fn = boost::bind<void>(test, _1);

Это работает, если я удалю спецификатор throw в определении функции. Неважно, что я кидаю, будь то класс или просто int. Я делаю что-то не так, или вы не можете привязываться к функциям, которые выдают исключения в Visual C++? Документы Boost Bind, кажется, не предполагают каких-либо проблем с этим, и у GCC нет проблем с этим в любом случае.

[Примечание: приведенный выше код не является моим настоящим кодом, но при компиляции возникает та же проблема. Пожалуйста, избегайте комментариев о том, что выбрасывать целые числа — это плохо и тому подобное, так как это всего лишь тривиальный пример на случай, если кто-то захочет воспроизвести проблему.]


person Malvineous    schedule 13.08.2012    source источник
comment
Вы должны подумать об удалении спецификаторов динамического броска в своем коде, они все равно устарели.   -  person PlasmaHH    schedule 13.08.2012
comment
У нас была аналогичная проблема в одном из наших старых проектов, и в итоге мы удалили все броски из наших объявлений func. Честно говоря, в наше время они мало чем полезны.   -  person steveg89    schedule 13.08.2012


Ответы (1)


Я не знаю, почему ваш код не работает на VC++. Однако в целом спецификаций исключений лучше избегать, потому что они могут привести к очень тонким эффектам. Посмотрите эту прекрасную колонку Херба Саттера Прагматичный взгляд на спецификации исключений:

Итак, вот что кажется лучшим советом, который мы, как сообщество, узнали на сегодняшний день:

Мораль №1: Никогда не пишите спецификацию исключений.

Мораль № 2: За исключением, возможно, пустой, но на вашем месте я бы избегал даже этого.

person TemplateRex    schedule 13.08.2012
comment
Интересно, спасибо за ссылку. Да, это не объясняет проблему, но предлагает хорошее решение :-) - person Malvineous; 14.08.2012