gpt4 book ai didi

c++ - 自移动 std::string 是否可移植?

转载 作者:行者123 更新时间:2023-12-04 12:07:49 25 4
gpt4 key购买 nike

std::string s = "y";
s = "x" + std::move(s) + "x";
Send(std::move(s));
Microsoft STL 实现会对此进行检查,但标准是否要求这样做?
它看起来比插入 + 追加或两个变量方法更干净。
注意:我知道我可以做 Send(std::move("x" + std::move(s) + "x")) ,但真正的代码并没有那么简单。

最佳答案

这里没有自我移动。自我移动是这样的:

s = std::move(s);
意思是
s.operator=(std::move(s));
换句话说,当 operator=被称为, this指向与参数相同的字符串。
在您的代码中, "x" + std::move(s)将首先评估,返回 std::string原值。换句话说,不是对 s 的引用,尽管串联可能会从 s 中“窃取”缓冲区.然后第二个 +被评估,并返回另一个纯右值。最后, operator=叫做。此时,右侧的纯右值必须具体化,因为它绑定(bind)到 operator= 的右值引用参数。 .所以我们只有 s从临时对象分配,该对象可能已被盗 s的缓冲区。但不管: s是标准库类型的对象,这意味着它处于“有效但未指定的状态”。自 s处于有效状态,并且与 RHS 不是同一个对象,没有问题。

关于c++ - 自移动 std::string 是否可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69395155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com