使用 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
为了解决这种歧义,在第二次调用中的 lambda 之前使用一元运算符。该运算符将 lambda 表达式转换为函数指针类型 void (*)(),它与第二个重载完全匹配。
根据 C 标准:
因此,表达式 []() {} 产生一个 void (*)() 函数指针,它明确匹配第二个重载.
需要注意的是,lambda 表达式也可以显式转换为函数指针类型以避免歧义:
foo((void (*)())([]() {}));
以上是当调用以 lambda 表达式作为参数的函数时,一元运算符如何解决歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!