C ++标准是否指定标准容器的类型依赖性?

时间:2019-06-20 19:43:21

标签: c++ language-lawyer c++-standard-library

在“ 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

1 个答案:

答案 0 :(得分:8)

您可能正在寻找:

  

[功能上的功能] / 2 特别是在以下情况下效果未定义:

     

...

     

(2.5)—如果在实例化模板组件时将不完整类型(6.9)用作模板参数,除非该组件特别允许。


在各种标准容器中, [容器] 部分指定可以使用不完整的类型实例化std::forward_liststd::liststd::vector。例如

  

[vector.overview] / 3 如果分配器满足分配器完整性要求(20.5.3.5.1),则在实例化T时可以使用不完整类型vector。 。在引用T所产生的专业化的任何成员之前,vector应该是完整的。

forward_listlist的措辞相似。