std :: map属性 - C +标准要求?

时间:2011-11-02 10:14:00

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

你好,祝你好运。

这是否正确(标准是否需要)标准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之前的这些属性...

那么......你觉得怎么样?

1 个答案:

答案 0 :(得分:2)

从我对C ++ 11中的标准( 23.2.4 [associative.reqmts] 的阅读,但已经在C ++ 03中保留),V为{{ 1}}和DefaultConstructible V不是实例化容器本身的强制要求,而只是使用它的一些操作。

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