Проявляется при применении template'ов функций и работе с boost::function при компиляции в MSVS 2005 SP1.
Рассмотрим вот такой маленький пример:
#include <boost/function.hpp>
template <class TResult>
TResult foo_template(TResult bar)
{
return bar;
}
int main(void)
{
boost::function<bool(bool)> boost_func = foo_template<bool>;
bool (*simple_func)(bool);
simple_func = &foo_template<bool>;
boost_func(true); // ooops!!! throws an exception here: the func is empty!
(*simple_func)(false); // this works fine
return 0;
}
В общем, казалось бы, ну куда проще... Задаём темплейт для функции, присваиваем указателю параметризованную функцию...
В примере реализованы два указателя - один через boost::function, второй - классический, определённый как обычный указатель на функцию.
Это прекрасно компилится, без единого ворнинга, НО! Сгенерированный компилятором MS 8.0 код даёт ран-тайм ошибку - нулевая функция в boost_func! А вот если закомментировать вызов boost_func - то всё нормально, "классический" указатель работает.
Все остальные протестированные мной компиляторы дают нормальный код, который правильно выполняется. А вот мелкософтовский даёт такой потайной баг.
Я также пробовала использовать "portable" синтакс библиотеки boost::function - то есть через boost::function1<bool,bool> - совершенно та же ситуация.
Может, у кого есть 2008 MS студия - надо бы под ней проверить, как эта конструкция работает. Я её ставить не хочу пока, в ней много рюшек и никаких плюсов для C++, судя по описаниям релиза. Но если там поправлена эта бага - то, видать, придётся обновить компилер.
Если и под ней не компилится - буду писать в boost. Пока вроде я не нашла упоминания такой баги у них в листах.