Был недостаток. Мы не могли использовать лямбды так же «на лету», как хотелось бы. C ++ 20 (с добавлением разрешения лямбды в неоцененных контекстах) делает этот код допустимым:
struct foo {
int x, y;
};
std::map<foo, decltype([](foo const& a, foo const& b) { return a.x < a.y; })> m;
Обратите внимание, как мы определили встроенную функцию сравнения? Не нужно создавать именованный функтор (в противном случае это может быть хорошей идеей, но мы не вынуждены ). И нет необходимости разбивать объявление на две части:
// C++17
auto cmp = [](foo const& a, foo const& b) { return a.x < a.y; };
std::map<foo, decltype(cmp)> m(cmp); // And also need to pass and hold it!
Такое использование (и многие другие) было мотивирующим фактором для внесения этих изменений. В приведенном выше примере анонимный тип функторов принесет все преимущества, которые может принести именованный тип функторов. Инициализация по умолчанию и EBO среди них.