Я знаю, что не существует конструктора по умолчанию для типа лямбда-замыкания.
Да, это так до C ++ 20. (Обратите внимание, что, поскольку C ++ 20, если захват не указан, тип закрытия имеет конструктор по умолчанию по умолчанию.)
Типы закрытия не являются DefaultConstructible. Типы замыканий имеют конструктор по умолчанию a deleted (until C++14)
no (since C++14)
. (до C ++ 20)
И
Как стандартная библиотека работает, когда decltype(myLambda)
передается в нечто вроде std::map
компараторов в параметре шаблона?
В стандартной библиотеке нет ничего особенного. Если в качестве типа компаратора для std::map
вы указали не-DefaultConstructible лямбду, вы должны передать объект конструктору, std::map
инициализирует его компаратор с помощью copy; У лямбды есть конструктор копирования и перемещения.
Вы можете изменить свой код так же, как конструктор std::map
:
template <typename FuncType>
std::pair<int,int> DoSomething(const FuncType& f = FuncType()) {
// auto z(f); // you can take a copy if necessary
return f(std::make_pair(1,1));
}
тогда
auto myLambda = [](std::pair<int,int> x) {
return std::make_pair(x.first*2,x.second*2);
};
std::pair<int,int> res = DoSomething<decltype(myLambda)>(myLambda);
ЖИТЬ