You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++ Primer中左值成员函数原地排序的疑问

关于C++ Primer中Foo::sorted()左值版本能否原地排序的疑惑解答

嘿,这个问题问得特别到位,其实咱们是对原书注释的语境理解有了偏差,咱们一步步捋清楚:

原书注释的真正含义

原书里的注释是针对那个**const &版本的sorted函数**来说的,不是泛指所有左值对象:

this object is either const or it is an lvalue; either way we can't sort in place

这句话的核心是:当调用的是const &版本的sorted时,不管当前对象是const左值,还是非const左值(因为非const左值可以隐式转换为const引用,会匹配到这个重载),在这个const成员函数里,我们没有权限修改当前对象的成员——std::sort会修改data的内容,而const成员函数里this是const Foo*类型,data也就成了const vector,自然不能直接原地排序,只能复制一份新对象来排序返回。

你的代码为什么能原地排序

你把原书的const &版本改成了非const的左值引用版本(&),这个版本的成员函数是非const的,意味着:

  • 它只能被非const的左值对象调用
  • 在这个函数里,this是Foo*类型,我们完全有权限修改当前对象的data成员,所以std::sort((*this).data.begin(),(*this).data.end())能直接修改原对象的vector,实现原地排序,这完全是合理的用法。

原书为什么没写这个版本

原书当时的代码是为了演示右值引用重载和const成员函数重载的场景,重点是区分右值(可以直接修改原地返回)和const/左值(只能返回副本)的不同处理逻辑。它没单独写非const左值引用的重载,是为了聚焦在const和右值的对比上,并不是说左值本身不能被原地排序。

验证你的代码效果

看你main函数里的输出:

  • f2是一个非const左值,调用sorted()&后,f2.print()会直接输出排序后的结果(原地修改了)
  • 而如果用原书的const &版本,f2调用sorted()后,f2本身的内容不会变,只有返回的f3是排序后的副本,这就是两者的区别。

所以结论是:你完全没有理解偏差,只是原书的注释是针对它那个特定的const&重载函数而言的,你写的非const左值引用版本是对原书代码的合理扩展,完全符合C++的规则~

内容的提问来源于stack exchange,提问作者zmwang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:22:02