提问者:小点点

为什么std::invocable概念阻止编译此代码


我不明白为什么在以下代码中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标志。


共1个答案

匿名用户

如果您查看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类型的参数调用。