显式实例化的std::less等无法转换为函数指针的客观原因是什么?
无状态Lambda与std::less对象的函数指针转换差异解析
先看这段合法的代码:
using Fun = bool(*)(int, int); constexpr auto less = [](int a, int b){ return a < b; }; Fun f{less};
无状态Lambda可以隐式转换为匹配签名的函数指针,但std::less<int>{}这类对象却无法转换为Fun类型。你能理解std::less<>{}不行的原因,但疑惑std::less<int>{}看起来和自己写的Lambda没区别,为什么不能转?
核心差异在于两者调用运算符的本质:
- 无状态Lambda的
operator()是编译器生成的全局普通函数,签名就是bool(int, int),和Fun的类型完全匹配,所以能直接转换为对应的函数指针。 - 而
std::less<int>的operator()是const成员函数,它的实际签名是bool(std::less<int> const&, int, int)——成员函数会隐式携带this指针作为第一个参数,这和Fun要求的签名完全不匹配,自然无法转换成普通函数指针。
哪怕std::less<int>是无状态的(没有非静态成员变量),它也只是个可调用对象,能在算法等场景中和Lambda互换,但成员函数指针和普通函数指针是C++里完全不同的类型,不存在直接转换的规则。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

