将函数的引用和 lambda 表达式作为参数传递时有什么区别?
What is the difference when passing function's reference and lambda expression as arguments?
我正在使用priority_queue
的自定义比较器,找到不同的行为。我已经知道STL容器需要特定类型传递到模板声明。使用普通功能时,应该是:
bool cmp(pair<int, int> &lhs, pair<int, int> &rhs) {
return lhs.first > rhs.first;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> pq1(v.begin(), v.end(), cmp);
但是使用lambda时,我发现正确的方法是:
auto comp = [](const pair<int, int>& lhs, const pair<int, int>& rhs){return lhs.second < rhs.second;};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> pq2(v.begin(), v.end(), comp);
我提到了宣布,但没有发表意见。有人可以解释编译器如何处理decltype(&function)
和decltype(lambda)
?
那是因为lambda表达式创建 object (匿名类(。
如果您使用&comp
,则获得对象的指针,该对象无法call。
您拥有的lambda基本上等同于
struct
{
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs)
{
return lhs.second < rhs.second;
}
} comp;
相关文章:
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 通过引用函数传递指针参数是什么意思?
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 将给定的 vararg 参数传递给另一个函数的适当方法是什么?
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 将对象数组作为参数传递的最佳方法是什么
- 将 lambda 作为模板参数传递:实际推导出什么类型
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 系统堆栈中的两个函数的递归调用(将不同数量的数组作为参数传递)有什么区别
- std::forward 在参数传递中的用法是什么?
- 关于将指针作为参数传递,我有什么不明白的?
- 在C++中将指针作为参数传递,我有什么误解
- 当使用of stream时,我应该在curl_easy_stopt中传递什么作为第三个参数
- 在函数中使用引用传递参数有什么问题?
- FindConnectionPoint,传递什么参数
- 传递到虚拟析构函数的这个额外参数是什么?
- 此互操作 C#/托管/非托管C++参数传递有什么问题?
- 我们应该在MurmurHash3参数中传递什么?
- 什么时候需要将数组的大小作为参数传递?