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

C++标准是否明确允许/禁止用不完全类型实例化std::function?

关于std::function<A(A)>使用不完全类型的标准合规性

首先直接给出结论:这种写法并不符合C++标准的技术规范,下面来拆解具体原因:

  • 先明确通用规则:

    根据C++标准中[res.on.functions](对应旧版标准的20.5.4.8)章节的规定:当实例化标准库模板时,不得使用不完全类型作为模板参数,除非该模板的标准文档明确允许这种操作——这条规则适用于所有标准库模板,并非仅针对容器类。

  • 再看std::function的特殊情况:
    在C++标准关于std::function的[func.wrap]章节中,没有任何条款明确允许使用不完全类型来实例化它。也就是说,当你写class A; std::function<A(A)> f;时,A属于不完全类型,直接违反了上面提到的通用规则。

  • 为什么主流编译器能通过编译?
    这是编译器提供的非标准扩展。像GCC、Clang、MSVC这类主流编译器,为了提升开发便利性,特意支持了这种用法,但这并不代表它符合标准要求。如果你的代码需要严格遵循C++标准以保证跨编译器兼容性,应该确保A是完全类型(即已经定义了class A的完整内容)后,再实例化std::function。

  • 补充对比:哪些模板允许不完全类型?
    部分标准库模板是明确允许不完全类型的,比如std::unique_ptr<A>、std::shared_ptr<A>(在[util.smartptr]章节有明确说明),但std::function不在此列。

内容的提问来源于stack exchange,提问作者FilippoL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:15:19