显式实例化std::less、std::greater和类似的std::less不提供到函数指针的转换,是否存在客观原因



无状态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 &)的转换将是有效的。

最新更新