2011-11-02 48 views
2

你好,祝你有美好的一天。std ::地图属性 - C +标准要求?

这是真的(是由标准的要求),该标准C++ std::map<Key, Value>类必须具有以下特性:

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

为什么我在问 - 我一直在问到为内部使用std :: map的类编写一个嵌入式替换。在IN过程中,事实证明该班级应该在没有operator=的情况下工作(只要您避免map[key] = value;)。我nuked operator=要求,但事实证明,使用默认的构造函数也造成了一些问题(o_O),因为类应该是没有默认的构造函数。那么......是那些std::map的标准属性,还是原始类依赖于实现特定/未定义的行为?我检查了“C++标准 - ANSI ISO 14882 2003”,我找不到任何这样的要求。我可能也可以核实“默认构造函数的要求”(只要用户避免某些调用,例如调用map[key]为不存在的键),但我当然没有听说过std :: map的这些属性...

所以...你觉得怎么样?

回答

2

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

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

+0

标准(C++ 03)指定哪些操作需要'V'为'DefaultConstructible'? – SigTerm

+0

'map [key]'需要默认的构造函数,因为如果'key'不存在,将会在地图中插入一个默认构造的实例。 - 这个代码路径需要存在,即使从未在运行时获取。 – visitor

+0

@SigTerm:是的,实际上每个操作都会详细说明各种需要遵守的要求(在一般要求之上)。大多数情况下,他们可以用一些逻辑来推断:) –