const std::filesystem::path引用的const性未生效,是我的代码存在错误吗?
问题本质
这是C++引用语义的正常表现,既没有破坏const约束,也不是编译器bug:
- 递归调用
HandleFilesInDirectory时你传入的是全局变量CurrentItem,函数形参const path& thisPath就是CurrentItem的别名,二者指向完全相同的内存对象 const path&的语义是你无法通过该引用修改指向的对象,但不限制通过其他途径修改对象本身。CurrentItem本身是无const修饰的可写变量,你直接对它赋值的行为完全合法,改动自然会同步反映到绑定它的thisPath引用上。
零额外开销解决方案
不需要改为值传递,也不需要新增临时变量,仅修改递归调用的传参即可解决问题:
把代码中的递归调用行:
HandleFilesInDirectory(CurrentItem);
修改为:
HandleFilesInDirectory(entry.path());
修改后thisPath会绑定到directory_entry返回的路径临时对象,和全局变量CurrentItem完全独立,后续对CurrentItem的所有修改都不会影响thisPath的取值,全程没有多余的路径字符串拷贝,完全符合你的性能要求。
补充说明
如果你的业务逻辑要求必须传入CurrentItem,也可以选择值传递方案:当前主流标准库的std::filesystem::path都实现了小字符串优化,短路径的拷贝开销几乎可以忽略,只有长度超过小字符串优化上限的路径才会产生堆内存拷贝,绝大多数文件遍历场景下性能影响可忽略不计。
内容的提问来源于stack exchange,提问作者Dakky
相关产品推荐
相关产品推荐

