我不明白为什么在以下代码中lambda和函数都不被识别为std::invocable
兼容类型:
#include <concepts>
#include <iostream>
void f( std::invocable auto callback)
{
callback(47);
}
void function_callback(int i)
{
std::cout << i << std::endl;
}
auto lambda_callback = [](int i )
{
std::cout << i << std::endl;
};
int main(int)
{
f(&function_callback);
f(lambda_callback);
}
我使用的GCC中继启用了-std=C++2A
标志。
如果您查看invocable
的定义(或者在标准中):
template< class F, class... Args >
concept invocable =
requires(F&& f, Args&&... args) {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
/* not required to be equality preserving */
};
这意味着:
void f( std::invocable auto callback)
如果我们把它写成长格式可能会更清楚:
template <typename F>
requires std::invocable<F>
void f(F callback);
f
可以不带参数调用--它是一个空函数(args...
在这里是一个空包)。 您的函数和lambda都不是空函数--它们都是一元函数,因此约束正确地拒绝了这些函数。
你可能想要的是:
void f( std::invocable<int> auto callback)
它检查callback
是否可以通过一个int
类型的参数调用。