【问题标题】:map operator [] and bool as value映射运算符 [] 和 bool 作为值
【发布时间】:2012-06-15 21:28:01
【问题描述】:

我们知道,如果我们尝试使用运算符 [] 访问不存在的键 std::map,该函数将使用该键插入一个新元素。

我们有:std::map<std::string, bool> map_xxx;

是否保证访问map_xxx["nonexistent_key"]不存在的key后,第二个参数的值永远是false

ps。如果没有,任何想法如何有这种行为?

【问题讨论】:

标签: c++ stl map


【解决方案1】:

是的。插入的值保证为false


在 C++98 中,该机制被称为默认初始化,指定为非类的零初始化;那是 false 布尔值。

从C++03开始,该机制称为值初始化,对于非类仍然指定为零初始化;因此布尔值仍然是false。例如,让我们看看 C++14 对此有什么看法。

来自第 23.4.4.3 节;只需将bool 替换为“T”即可。

T& 运算符[](const key_type& x);

  1. 效果:如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入映射中。
  2. 要求:key_type 应为 CopyInsertable,mapped_type 应为 DefaultInsertable into *这个。

从第 8.5 节开始,自下而上消化段落:

对 T 类型的对象或引用进行零初始化意味着:

—如果 T 是标量类型 (3.9),则将对象初始化为通过将整数文字 0(零)转换为 T 获得的值;

...

值初始化类型 T 的对象意味着:

——如果 T 是一个(可能是 cv 限定的)类类型(第 9 条),没有默认构造函数(12.1)或用户提供或删除的默认构造函数,则对象被默认初始化;

——如果 T 是一个(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,则该对象被零初始化并检查默认初始化的语义约束,如果 T 有一个非-trivial 默认构造函数,对象是默认初始化的;

——如果T是一个数组类型,那么每个元素都是值初始化的;

——否则,对象被零初始化

...

初始化器为空括号集的对象,即(),应值初始化

从 §4.12:

算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。一个零值、空指针值或空成员指针值被转换为false;任何其他值都将转换为 true。对于直接初始化 (8.5),std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果是假的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多