无状态lambda可以转换为函数指针,例如:
using Fun = bool(*)(int, int);
constexpr auto less = [](int a, int b){ return a < b; };
Fun f{less};
但是像std::less<int>{}
这样的对象不能。
我确实理解为什么std::less<>{}
不能,因为它的operator()
没有实例化,直到对象被应用到一些参数,所以它怎么能被转换为Fun
,如果它的模板参数是什么还没有采取的决定?
但std::less<int>{}
似乎与我上面写的lambda相同,不是吗?
无状态lambda可以转换为函数指针,例如this is valid,[…]]但是像
std::less<int>{}
这样的对象不能。
"'t"用错词了。毕竟,一个"无状态的lambda"它只是一个物体,与其他物体相比,它没有任何神奇的规则。lambda是一种与其他类类型类似的类类型。它只是由编译器生成的。你可以手工编写一个类型来做lambda做的任何事情;只是需要更多的代码。
将无状态lambda转换为函数指针的能力同样不是魔法。任何类型都可以为其定义转换操作符,从而允许它们隐式地转换为任意类型。对于无状态lambda,编译器只生成一个指针的转换操作符,该指针指向适当的函数指针签名。
std::less<T>
可以有一个operator bool (*)(T const&, T const&)() const
重载,它返回一个指向进行这种比较的函数的指针。但是它不。没有什么可以阻止它这样做,除了c++标准没有规定类型必须有这样一个接口。
这并没有发生,因为没有人提出标准化。
std::less<int>
有一个非静态成员函数(operator()
),它接受两个int
并返回一个bool
。
这是错误的(正如@HolyBlackCat指出的):
可转换为函数指针
bool (*)(const std::less<int> *, const int &, const int &)
。(或指向成员函数的指针)
可以转换为指向成员函数的指针:bool (std::less<int>::*)(const int &, const int &) const
如果它被定义为静态成员函数,那么到bool (*) (const int &, const int &)
的转换将是有效的。