模板函数中的默认lambda参数
我想在模板函数中默认一个 lambda 参数,但它无法编译。我错过了什么?
template <typename F>
void foo(
F f = [](){
std::cout << "Hello!n";
}
) {
f();
}
int main() {
foo(); // 1. does not compile
foo([](){ // 2. this is ok
std::cout << "Hello!n";
});
}
回答
您无法从默认函数参数推导出函数的模板参数。有关为何实施此限制的详细信息,请参阅此问题。
所以你必须自己提供一个默认的模板参数。由于您需要 lambda 的类型和值,因此一个简单的方法是编写一次 lambda,然后在函数模板中使用它。
auto lambda = []()
{
std::cout << "Bye!n";
};
template <typename F = decltype(lambda)> // default parameter
void foo(F f = lambda) // default value
{
f();
}
这是一个演示