首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++23 string::resize_and_overwrite以rvalue的形式调用操作?

为什么C++23 string::resize_and_overwrite以rvalue的形式调用操作?
EN

Stack Overflow用户
提问于 2021-10-18 09:57:19
回答 1查看 508关注 0票数 13

为了提高将数据写入std::string的性能,C++23专门引入了面向std::stringresize_and_overwrite()。在[string.capacity]中,标准将其描述如下:

模板resize_and_overwrite(size_type n,op操作);

  1. 让 - o = size()在呼叫resize_and_overwrite之前。 - k be min(o, n). - p是一个charT*,这样在调用之前,范围pp + n是有效的,this->compare(0, k, p, k) == 0true。在范围p + kp + n中的值可能是不确定的[basic.indet]。 - OP是表示std::move(op)(p, n)。 - r = OP

..。

  1. 效果:评估OP,用[pp + r)替换*this的内容,并使所有指针和对range pp + n的引用无效。

但是,我发现这个函数将在调用它之前使用std::moveop转换为rvalue,这意味着我们不能传入只有lvalue重载operator() (演示)的可调用函数:

代码语言:javascript
复制
#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调用的任务有什么好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-18 16:38:18

op在被销毁之前只被调用一次,因此将其作为rvalue调用允许它上的任何&&重载重用它可能保存的任何资源。

可调用对象在道义上是xvalue --它“到期”,因为它在调用后立即被销毁。如果您专门将可调用设计为只支持作为lvalue的调用,那么库很乐意通过阻止这种调用来实现。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69614109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档