在“ Codependent types with unordered_map ”中,发现
std::unordered_map<Key, Value>
在libstdc ++中对Value
具有类型依赖性(这是意外的),而在libc ++和MSVC中对Value
没有类型依赖性。
通常,ISO C ++规范是否完全讨论容器的类型依赖关系?如果可以的话,您能指出我相关的部分吗?
类型依赖:我不确定ISO C ++规范中是否存在类型依赖的正式定义,但是出于本文的目的,让我们说一个type A
如果不能仅使用B的前向声明来编译A,则对type B
具有类型依赖性。示例:
struct Val; // forward declaration of Val
struct Container {
Val v;
}; // Compile error; Type Val is incomplete. Container has a type dependency on Val
struct Val; // forward declaration of Val
struct Container2 {
Val *v;
}; // Compiles. Container2 does not have type dependency on Val
答案 0 :(得分:8)
您可能正在寻找:
[功能上的功能] / 2 特别是在以下情况下效果未定义:
...
(2.5)—如果在实例化模板组件时将不完整类型(6.9)用作模板参数,除非该组件特别允许。
在各种标准容器中, [容器] 部分指定可以使用不完整的类型实例化std::forward_list
,std::list
和std::vector
。例如
[vector.overview] / 3 如果分配器满足分配器完整性要求(20.5.3.5.1),则在实例化
T
时可以使用不完整类型vector
。 。在引用T
所产生的专业化的任何成员之前,vector
应该是完整的。
forward_list
和list
的措辞相似。