为何C++递归定义std::map可编译,递归std::unordered_map却编译失败
编译差异核心原因解析
核心差异源于std::map与std::unordered_map对值类型的完整性要求不同:
- 定义
FileSystemMap结构体时,声明内部directories成员的阶段,FileSystemMap本身尚未完成定义,属于不完整类型:仅存在类型声明,无完整结构定义,编译器无法确定其内存大小、成员布局等信息。 std::map属于有序关联容器,底层默认基于红黑树实现,g配套的libstdc标准库实现中,红黑树节点仅需要存储指向值类型的指针即可完成容器实例化,不需要值类型为完整类型,C++17及之后的标准也明确支持std::map可以使用不完整类型作为值类型,因此代码可以正常编译。std::unordered_map属于无序关联容器,底层默认基于哈希表实现,实例化过程中需要明确值类型的完整定义来计算哈希节点的内存布局、处理值类型的构造析构逻辑等,必须要求值类型为完整类型,不完整类型无法满足这一要求,因此编译失败。
内容的提问来源于stack exchange,提问作者janeD
相关产品推荐
相关产品推荐

