4

我很熟悉,appendinstd::string返回std::string&,因此它不符合被移动的条件,所以结果不会被移动。

#include <string>


int main()
{
    std::string s = std::string("A").append("B");
    return s.size();
}

https://godbolt.org/z/M63aWW

#include <string>


int main()
{
    std::string s = std::move(std::string("A").append("B"));
    return s.size();
}

https://godbolt.org/z/jTnsac

在那里您可以看到,后一个示例将产生更少的分配,因此在这种情况下,最好移动一些看起来像临时的东西。我的问题是为什么他们(委员会)不添加简单&&的重载来生成结果,或者append取决于上下文?我的意思是类似于正在做的事情。有没有一个例子可以证明这种优化是虚假的?std::string&std::string&&std::optionalvalue

4

2 回答 2

7

您不能简单地添加&&重载。您也必须制作原始功能&。这可能是一个突破性的变化。

所有这些都是为了很少的收获。由于append()修改了源字符串并返回*this更多用于链接而不是将结果分配给其他任何内容,因此您编写的代码是单调的。如果需要,请使用+,这是为表达式结果构建字符串的惯用形式,并且已经具有必要的重载以提高效率:

auto s = "A"s + "B";
于 2020-07-21T09:55:08.013 回答
7
于 2020-07-21T10:44:09.967 回答