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
相关产品推荐
相关产品推荐

