首页 >后端开发 >C++ >当调用以 lambda 表达式作为参数的函数时,一元运算符如何解决歧义?

当调用以 lambda 表达式作为参数的函数时,一元运算符如何解决歧义?

Patricia Arquette
Patricia Arquette原创
2024-11-14 16:22:02416浏览

How does the unary   operator resolve ambiguity when calling a function with a lambda expression as an argument?

使用 Lambda 函数的一元运算符解决不明确重载

在提供的代码片段中:

void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }

int main()
{
    foo([]() {}); // ambiguous
    foo(+[]() {}); // resolves to function pointer overload
}

第一个对 foo 的调用不明确,无法编译。这种歧义是由于 lambda 表达式可以隐式转换为 std::function 和 std::function 的事实引起的。和 void (*f)().

为了解决这种歧义,在第二次调用中的 lambda 之前使用一元运算符。该运算符将 lambda 表达式转换为函数指针类型 void (*)(),它与第二个重载完全匹配。

根据 C 标准:

  • 一元运算符将参数转换为其基础类型(算术、枚举或指针)。
  • 对于 lambda 表达式,闭包类型中显式转换函数转换为具有相同参数和返回类型的函数指针。

因此,表达式 []() {} 产生一个 void (*)() 函数指针,它明确匹配第二个重载.

需要注意的是,lambda 表达式也可以显式转换为函数指针类型以避免歧义:

foo((void (*)())([]() {}));

以上是当调用以 lambda 表达式作为参数的函数时,一元运算符如何解决歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn