【问题标题】:unordered_map emplace with default constructorunordered_map 使用默认构造函数
【发布时间】:2020-03-20 16:04:20
【问题描述】:

我有 unordered_map,键值对分别为 string 和 aClass;其中 aClass 不能移动(它有一个互斥锁)。我也不希望它被复制构造;我认为复制构造一个包含互斥锁的类是不明智的。 为了延迟项目的构建直到它插入到地图中,我尝试使用 emplace 将它插入到地图中,因此,第二个参数必须为空:

aList.emplace("aString");

但是,上一行不起作用。 任何想法如何使用默认构造函数进行安置? 我也试过:

aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");

谢谢,

【问题讨论】:

    标签: c++ c++14 unordered-map emplace


    【解决方案1】:

    如果你可以访问 C++17,你可以使用try_emplace:

    myMap.try_emplace("someKey");
    

    这将默认构造一个带有键“someKey”的新元素。

    在 C++17 之前,您可以通过 std::pairstd::piecewise_construct 构造函数和值的参数的空元组来使用 emplace

    myMap.emplace(std::piecewise_construct,
                  std::forward_as_tuple("someKey"),
                  std::tuple<>{});
    

    【讨论】:

      【解决方案2】:

      一种解决方案是使用std::unordered_map&lt;&gt;::operator[],它使用默认构造函数创建新元素:

      auto& element = m["aString"]; // Creates a new element or gets an existing one.
      

      或者,如果不需要返回值:

      static_cast<void>(m["aString"]);
      

      【讨论】:

      • 你的和下面的表达是一样的吗? (void) (m["aString"])
      • @b.g.是的,(void)expr;static_cast&lt;void&gt;(expr); 的效果是一样的。
      • m["aString"];表达就够了。 @Maxim,具有 -Wall 和 -Wextra 标志的编译器 gcc 不会警告我使用 m["aString"] expression,而无需强制转换为 void。我应该担心吗?
      • @b.g.转换为 void 有两个目的:禁用编译器警告(如果有),并记录您有意而不是错误地忽略返回值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多