我最近发现下面的代码编译得很好
void func(std::function<void()> cb);
func([]() -> asio::awaitable<void> {
...
co_return.
}).
这让我猜测 c++ 没有正确区分
std::function<void()>
和 std::function<asio::awaitable<void>()>
类型参数。
事实上下面的代码确实无法编译:
void func(std::function<void()> cb);
void func(std::function<asio::awaitable<void>()> cb);
编译器会抱怨它无法区分两个函数之间的区别。
lambda 可以转换为两者
std::function<void()>
和
std::function<asio::awaitable<void>()>
因为
std::function
接受任何其返回类型可以转换为其模板参数中指定的类型的可调用对象。任何类型都可以转换为 void
(即通过忽略返回值),因此第一个特化的可调用返回什么并不重要。
因为 lambda 到
std::function
特化的转换是通过 std::function
的构造函数进行的用户定义转换,并且因为两者显然都使用不同的构造函数(因为它们是不同的目标类型),所以在重载中,两者都不被认为比另一个更好如果您声明同时使用两者作为参数的函数,则解析会导致调用的重载解析不明确。