std::not_fn与std::function构造转换不一致是否为有意设计?
std::not_fn与std::function的显式bool转换行为差异
当定义如下代码时:
struct Foo { }; constexpr auto pred = [](){ return Foo{}; };
调用std::not_fn(pred)会如预期般编译失败。
但为Foo添加显式布尔转换运算符后:
struct Foo { explicit operator bool() { return true; } };
std::not_fn(pred)即可成功编译。
然而此时会出现如下矛盾情况:
std::function<bool(int)> f{std::not_fn(pred)}; // 编译通过 std::function<bool(int)> g{pred}; // 编译失败
虽然从功能定位看,std::not_fn作为谓词取反工具,尝试将返回类型转换为bool有其合理性,但为何std::function不采用类似策略?或者说,为何std::function不允许的转换,std::not_fn却允许?
实际上,这是因为std::not_fn的实现中使用了!运算符,从而支持了返回非bool但可显式转换为bool类型的函数。
附:Arthur O’Dwyer所写的一篇关于协变与逆变的有趣博客文章。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

