【问题标题】:Does the C++ standard specify the type dependencies of standard containers?C++ 标准是否指定了标准容器的类型依赖关系?
【发布时间】:2019-06-20 19:43:21
【问题描述】:

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

【问题讨论】:

  • 类型依赖是C++中一个具有特殊含义的术语。考虑改写。
  • @L.F.感谢您指出这一点。网络搜索并没有引导我找到标准的相关部分。如果你能指出我将不胜感激(类型依赖的定义)
  • 该术语在[temp.dep]中定义。
  • @L.F.听起来不错,我只是想不出更好的选择。如果您有任何建议,我会很高兴听到。

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


【解决方案1】:

您可能正在寻找这个:

[res.on.functions]/2 特别是,在以下情况下效果未定义:

...

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


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

[vector.overview]/3 如果分配器满足分配器完整性要求 (20.5.3.5.1),则在实例化 vector 时可以使用不完整类型 TT 应在 vector 的结果特化的任何成员被引用之前完成。

forward_listlist 的措辞相似。

【讨论】:

  • 这看起来很有希望。我正在深入研究这一点,并将回来。谢谢
  • 来自 boost 文档:“最后,C++17 在 std::vector、std::list 和 std::forward_list 中添加了对不完整类型的支持(请参阅 N4569:对标准容器的最小不完整类型支持,修订版 4 的详细信息),但没有其他容器,如 std::set/map/unordered_set/unordered_map, "
  • 非常感谢这个有见地的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多