std::vector::emplace_back 和 std::move

新手上路,请多包涵

一起使用 std::vector::emplace_backstd::move 有什么好处吗?或者它只是多余的,因为 std::vector::emplace_back 会进行就地构造?

澄清案例:

 std::vector<std::string> bar;

第一的:

 bar.emplace_back(std::move(std::string("some_string")));

第二:

 std::string str("some_string");
bar.emplace_back(std::move(str));

第三:

 bar.emplace_back(std::move("some_string"));

原文由 Humam Helfawi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 757
1 个回答

在第二个版本中,有一个优势。调用 emplace_back 将调用 --- 的移动构造函数,当使用 std::move std::string 时,它可以保存在副本中(只要该字符串存储在SSO 缓冲区)。请注意,在这种情况下,这与 push_back 基本相同。

std::move 在第一个版本中是不必要的,因为字符串已经是prvalue。

std::move 在第三个版本中是无关紧要的,因为不能从中移动字符串文字。

最简单和最有效的方法是这样的:

 bar.emplace_back("some_string");

这不需要不必要的 std::string 构造,因为文字被完美地转发给构造函数。

原文由 TartanLlama 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题