为了提高写入数据的性能std::string
,C++23专门resize_and_overwrite()
为std::string
. 在[string.capacity]中,标准对其进行了如下描述:
template<class Operation> constexpr void resize_and_overwrite(size_type n, Operation op);
让
—
o = size()
在调用resize_and_overwrite
.——
k
成为min(o, n)
。—
p
是 acharT*
,使得范围 [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
替换 的内容,并使对范围 [ , ]的所有指针和引用无效。*this
p
p + r
p
p + n
但是我发现这个函数在调用它之前会std::move
用来转换op
成一个右值,这意味着我们不能传入一个只有左值重载的可调用对象operator()
(demo):
#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
必须作为右值调用的好处?