【问题标题】:std::map properties - C+ standard requirements?std::map 属性 - C+ 标准要求?
【发布时间】:2011-12-20 04:33:04
【问题描述】:

你好,祝你有美好的一天。

标准 C++ std::map<Key, Value> 类是否需要具有以下属性:

  • 如果Value 没有operator=operator= 是私有的(并且std::map 不是Value 的私人朋友),它可以工作。
  • 如果 Value 没有默认构造函数或默认构造函数是私有的(并且std::map 不是 Value 的私有朋友),它可以工作

我为什么要问 - 我被要求为在内部使用 std::map 的类编写一个替代品。在过程中,结果证明该类应该在没有operator= 的情况下工作(只要你避免map[key] = value;)。我对operator= 要求进行了核对,但结果证明对 Value 使用默认构造函数也会导致一些问题 (o_O),因为应该是 Value 的类没有默认构造函数。那么......是std::map 的那些标准属性,还是依赖于特定于实现/未定义行为的原始类?我检查了“C++ 标准 - ANSI ISO IEC 14882 2003”,但找不到任何此类要求。我可能也可以核对“默认构造函数要求”(只要用户避免某些调用,例如调用 map[key] 以获得不存在的键),但我之前肯定没有听说过 std::map 的这些属性。 .

那么……你怎么看?

【问题讨论】:

    标签: c++ stl map standards undefined-behavior


    【解决方案1】:

    根据我对标准的阅读(23.2.4 [associative.reqmts] 在 C++11 中,但在 C++03 中已经持有),VDefaultConstructibleVCopyAssignable 不是实例化容器本身的强制性要求,而只是使用它的一些操作。

    但是在 C++03 中,对于所有标准容器,V 必须是 CopyConstructible。无条件的。在 C++11 中,这一要求被取消,因为可以使用新的 emplace* 方法直接在适当位置构建对象。

    【讨论】:

    • 标准 (C++03) 是否指定哪些操作需要 VDefaultConstructible
    • map[key] 需要默认构造函数,因为如果key 不存在,则会在地图中插入默认构造的实例。 - 这个代码路径需要存在,即使在运行时从未使用过。
    • @SigTerm:是的,实际上每个操作都会详细说明各种需要遵守的要求(在一般要求之上)。但大多数时候,它们可以用一点逻辑来推断:)
    • @Matthieu M.:是的,我知道有可能弄清楚,但如果您设计一个替代品,最好还是坚持文档。不管怎样,我接受你的回答。
    • @SigTerm:如果您没有标准,我建议使用SGI STL documentation,这不完全是标准化的(有像rope 这样的类从未实现过),而是针对类确实将其纳入标准,它应该对您有很大帮助。
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多