【发布时间】:2020-11-10 16:08:26
【问题描述】:
我很熟悉,std::string 中的append 返回std::string&,因此它不符合被移动的条件,因此结果不会被移动。
#include <string>
int main()
{
std::string s = std::string("A").append("B");
return s.size();
}
#include <string>
int main()
{
std::string s = std::move(std::string("A").append("B"));
return s.size();
}
您可以看到,后一个示例将产生更少的分配,因此在这种情况下,最好移动一些看起来像临时的东西。我的问题是为什么他们(委员会)不根据上下文在&& 上添加简单的重载以使append 的结果为std::string& 或std::string&&?我的意思是类似于std::optional 的事情正在处理value。有没有例子可以证明这种优化是假的?
【问题讨论】:
-
你能发布一个实际有用的例子吗?自动 res = std::string("A").append("B");剂量真的很有意义。
-
@Cortex 是的,这没有意义,但是当您尝试连接几个字符串时,可能会非常大,您希望尽可能少地重新分配。而
append将重用缓冲区,因此总体分配会更少。 -
解决方法:
std::string s = std::move(std::string("A").append("B"));但对所有这一切都很重要。这不是一个引人注目的用例。
标签: c++ stdstring rvalue-reference stdoptional