从函数/方法返回常量值的实际优势是什么?
我特别理解你现在的困惑——看你贴的代码,返回const std::string的时候,确实没法直接给f.get()赋值,而拿到副本后还是能随便改,好像这个const加不加没区别?但其实它不是完全没用的,咱们来掰扯掰扯实际场景里的作用:
阻止无意义的意外操作
如果你返回的是自定义类的对象(不是std::string这种基础值类型),返回const值能避免调用者在返回的临时副本上执行无效的修改操作。比如假设你有一个User类,带有setName这种非const成员函数,如果你的getUser()返回非const值,那么getUser().setName("test")这种代码会编译通过——但这个修改完全是无用的,因为你改的是临时副本,用完就销毁了。但如果返回const User,编译器会直接报错,帮你提前发现这种无意义的操作。明确接口语义,提升代码可读性
从接口设计的角度,返回const相当于给所有调用者一个明确的信号:“这个函数返回的是一个只读的结果,它的作用是提供数据,不是供你修改的”。虽然技术上大家还是可以把它拷贝到非const变量里修改,但这个const修饰符能清晰传达你的设计意图,让其他开发者一眼就能明白这个函数的定位,减少代码理解成本。适配重载解析与旧代码场景
在某些重载函数的场景里,返回const值会影响编译器的函数匹配逻辑。比如如果有两个重载:void handle(const std::string&)和void handle(std::string&&),当你返回const std::string时,编译器会更倾向于匹配const引用的重载版本,这有时候是你刻意想要的行为。另外一些老旧的C++代码库,可能会依赖返回值的const属性来正常工作,这时加上const就能兼容这些场景。
回到你给出的代码例子,之所以你感觉不到它的作用,是因为std::string是值类型,返回的是临时副本,const主要限制的是这个临时副本本身的修改(比如你注释里的f.get() = "Thanks"这种非法操作),而你把它赋值给非const变量后自然还是能改——这是完全正常的,因为你操作的是副本,不是原返回值本身。
内容来源于stack exchange

