Я экспериментировал с lambdas и компиляторами из-за другого вопроса здесь, на SO.
Я только что понял (и это совершенно нормально), что следующий код действителен:
int main() {
auto l = [](){};
l.operator()();
}
Фактически стандарт говорит, что тип замыкания имеет открытый оператор вызова встроенной функции и т.д., поэтому имеет смысл активировать его.
То, что я не могу объяснить, посмотрев на стандарт (ну, рабочий проект), является тот факт, что GCC (6.1) компилирует следующий фрагмент кода (clang 3.9 не делает):
int main() {
auto l = []<typename>(){};
l.operator()<void>();
}
Нет предупреждений, ошибок нет. Это допустимый код или он должен быть отклонен компилятором?