Ted*_*Ted 5 c++ lambda function ambiguity c++11
下面的代码不能在gcc 4.5上编译,因为对foo的调用是不明确的.消除歧义的正确方法是什么?
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void(int, int)> t)
{
t(1, 2);
}
void foo(std::function<void(int)> t)
{
t(2);
}
int main()
{
foo([](int a, int b){ cout << "a: " << a << " b: " << b << endl;});
}
Run Code Online (Sandbox Code Playgroud)
最好的方法是显式创建一个std::function正确类型的对象,然后将该对象传递给该函数:
std::function<void(int, int)> func =
[](int a, int b) { cout << "a: " << a << " b: " << b << endl; }
foo(func);
Run Code Online (Sandbox Code Playgroud)
或内联:
foo(
std::function<void(int, int)>(
[](int a, int b) { cout << "a: " << a << "b: " << b << endl; }
));
Run Code Online (Sandbox Code Playgroud)
std::function 有一个接受任何东西的构造函数模板:
template<class F> function(F);
Run Code Online (Sandbox Code Playgroud)
正因为如此,有没有办法过载决议,在编译器知道foo选择:既std::function<void(int)>和std::function<void(int, int)>有一个构造函数,可以把你的Lambda表达式作为参数.
std::function直接传递对象时,std::function复制构造函数在重载解析期间是首选,因此选择它而不是构造函数模板.
未来的答案: 如果保证捕获列表为空,您也可以使用普通函数指针.在C++ 0x中,无捕获的lambda可以隐式转换为函数指针.所以,你可以使用类似的东西
void foo(void (*t)(int, int)) { t(1, 2); }
void foo(void (*t)(int)) { t(1); }
Run Code Online (Sandbox Code Playgroud)
并foo使用无捕获的lambda(或具有匹配类型的函数指针)直接调用.
请注意,此转换是草案语言标准的最新补充(它在今年2月添加),因此它不太可能得到广泛支持.Visual C++ 2010还不支持它; 我不知道最新的g ++.
| 归档时间: |
|
| 查看次数: |
753 次 |
| 最近记录: |