一起使用 std::vector::emplace_back
和 std::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 许可协议
在第二个版本中,有一个优势。调用
emplace_back
将调用 --- 的移动构造函数,当使用std::move
std::string
时,它可以保存在副本中(只要该字符串存储在SSO 缓冲区)。请注意,在这种情况下,这与push_back
基本相同。std::move
在第一个版本中是不必要的,因为字符串已经是prvalue。std::move
在第三个版本中是无关紧要的,因为不能从中移动字符串文字。最简单和最有效的方法是这样的:
这不需要不必要的
std::string
构造,因为文字被完美地转发给构造函数。