为了提高将数据写入std::string的性能,C++23专门引入了面向std::string的resize_and_overwrite()。在[string.capacity]中,标准将其描述如下:
模板resize_and_overwrite(size_type n,op操作);
o = size()在呼叫resize_and_overwrite之前。
- k be min(o, n).
- p是一个charT*,这样在调用之前,范围p、p + n是有效的,this->compare(0, k, p, k) == 0是true。在范围p + k,p + n中的值可能是不确定的[basic.indet]。
- OP是表示std::move(op)(p, n)。
- r = OP。..。
OP,用[p,p + r)替换*this的内容,并使所有指针和对range p、p + n的引用无效。但是,我发现这个函数将在调用它之前使用std::move将op转换为rvalue,这意味着我们不能传入只有lvalue重载operator() (演示)的可调用函数:
#include <string>
int main() {
struct Op {
int operator()(char*, int) &;
int operator()(char*, int) && = delete;
} op;
std::string s;
s.resize_and_overwrite(42, op); // ill-formed
}这种行为似乎有点奇怪,但由于这一更改是在本文的上一版中进行的,因此显然是有意的。
那么,这背后的考虑是什么呢?必须将op作为rvalue调用的任务有什么好处吗?
发布于 2021-10-18 16:38:18
op在被销毁之前只被调用一次,因此将其作为rvalue调用允许它上的任何&&重载重用它可能保存的任何资源。
可调用对象在道义上是xvalue --它“到期”,因为它在调用后立即被销毁。如果您专门将可调用设计为只支持作为lvalue的调用,那么库很乐意通过阻止这种调用来实现。
https://stackoverflow.com/questions/69614109
复制相似问题