Я заметил некоторую несогласованность между двумя компиляторами (g++ 4.5, VS2010 RC) в том, как они соответствуют lambdas с частичной специализацией шаблонов классов. Я пытался реализовать что-то вроде boost:: function_types для lambdas для извлечения черт типа. Подробнее см. .
В g++ 4.5 тип operator()
лямбда, по-видимому, похож на тип свободной стоячей функции (R (*) (...)), тогда как в VS2010 RC это похоже на тип функция-член (R (C:: *) (...)). Итак, вопрос заключается в том, что писатели-компиляторы могут интерпретировать все так, как они хотят? Если нет, какой компилятор прав? Подробнее см. Ниже.
template <typename T>
struct function_traits
: function_traits<decltype(&T::operator())>
{
// This generic template is instantiated on both the compilers as expected.
};
template <typename R, typename C>
struct function_traits<R (C::*)() const> { // inherits from this one on VS2010 RC
typedef R result_type;
};
template <typename R>
struct function_traits<R (*)()> { // inherits from this one on g++ 4.5
typedef R result_type;
};
int main(void) {
auto lambda = []{};
function_traits<decltype(lambda)>::result_type *r; // void *
}
Эта программа компилируется как для g++ 4.5, так и для VS2010, но созданные экземпляры function_traits различаются, как указано в коде.