QString的+运算符返回const QString而非QString的设计原因是什么?
+运算符返回const QString的设计依据 QString这个返回const的设计是Qt团队早期刻意做出的决策,核心是为了规避潜在问题、引导更高效的字符串操作习惯,具体原因如下:
防范悬空引用问题
在C++98标准中,非const左值引用无法绑定到临时对象,但const左值引用可以。如果operator+返回非const QString,开发者可能写出QString& ref = str1 + str2;这类代码——ref会绑定到一个即将销毁的临时对象,直接引发未定义行为。返回const QString能让编译器直接报错,从编译层面杜绝这种低级错误。适配隐式共享机制
QString依赖*隐式共享(写时复制)*来优化内存和性能。如果返回非const,开发者可能直接对临时对象执行修改操作,比如(a + b).replace(...),但临时对象用完即销毁,这种修改不仅没有实际意义,还会触发写时复制额外消耗资源。返回const能引导开发者先将结果赋值给可修改变量后再操作,更贴合隐式共享的最佳实践。兼容早期C++标准局限性
这个设计起源于C98时代,那时还没有C11的移动语义。后来std::basic_string在C11中调整operator+返回非const,是因为移动构造可以高效处理临时对象,同时解决了C98时代的引用绑定问题。而Qt为了保持向后兼容性,一直保留了返回const QString的设计。避免无意义的链式修改
返回const能阻止开发者在链式调用中对临时对象做无意义修改,比如(str1 + str2).append(str3)这类写法,修改后的临时对象无法被保留,完全是无效操作。返回const能让开发者更清晰地意识到:需要修改的话,先把运算结果存储到变量中再操作。
内容的提问来源于stack exchange,提问作者fabian

