You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:52:38