Сел написать небольшую функцию и сразу два "открытия".
Проверял только на msvc2010.
class A
{
enum E {ea,eb,ec};
template<typename Iter, typename Pred>
static void my_func(Iter begin, Iter end, Pred pr) {}
static void foo(const char *str = "ABC")
{
const char *p = str;
my_func(p, p+strlen(p), [&p]() -> E
{
if( 'A' == *p ) { <- Попробуйте закинуть в Watch или же просто выделить сравенние и посмотреть результат. Студя скажет что это false, хотя и вычислается правильно т.е. true.
return ea; <- Здесь не знает что такое ea, бага компилятора что б скомпилить надо выностить enum за пределы класса.
}
}
);
}
};