#include <functional>
void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }
int main ()
{
foo( [](){} );
}
VS编译,gcc和clang抱怨模糊的超载。谁是对的? lambda应该是类类型,因此它和函数指针之间不应该有任何转换。因此VS似乎是对的,不顾一切。但也许我错过了一些东西。
除了将lambda强制转换为任何一种类型之外,还有一种简单的方法来消除调用的歧义吗?
答案 0 :(得分:4)
lambda创建一个可以被调用的匿名和未指定的对象,它既不是函数指针也不是std::function
对象,但可以同时用作函数指针和std::function
对象,模糊的过载错误。我会说VS错了。
此外,由于函数指针可用于创建std::function
对象,我会说如果你已经有一个std::function
函数,则不需要使用带有函数指针的重载参数。
答案 1 :(得分:3)
非捕获lambdas具有对具有相同签名的函数指针的隐式转换。这在第5.1.2章第6节中规定:
没有lambda-capture的lambda表达式的闭包类型有一个 public非虚拟非显式const转换函数指针 具有与闭包相同的参数和返回类型的函数 type的函数调用运算符。此转换返回的值 function应该是一个函数的地址,当被调用时,它具有 与调用闭包类型的函数调用操作符的效果相同。