boost::filesystem::path 中的“/”字符有啥用?

Posted

技术标签:

【中文标题】boost::filesystem::path 中的“/”字符有啥用?【英文标题】:What is the use of the "/" character in boost::filesystem::path?boost::filesystem::path 中的“/”字符有什么用? 【发布时间】:2018-06-13 16:52:02 【问题描述】:

我在 C++ 程序中遇到了这一行,但不明白“/”的使用方式或原因。有什么建议吗?

boost::filesystem::path pathLockFile = GetDataDir() / ".lock";

【问题讨论】:

操作员过载? en.cppreference.com/w/cpp/language/operators GetDataDir 听起来不像 Boost 中的函数——它不遵循它们的命名约定。您的哪个库定义了该功能? 你有所有的源代码,你为什么不阅读它或在调试器中单步调试它呢?另外,关于您的问题,请考虑a = b / c; 【参考方案1】:

这是一个简单的运算符重载案例。operator/ 已为 path 类型的对象重载。 当您在 boost::filesystem::path 对象上使用 / 时,它会附加它们。

所以当你写的时候:boost::filesystem::path pathLockFile = GetDataDir() / ".lock";

它扩展为:boost::filesystem::path pathLockFile = boost::filesystem::path("/tmp/data") / ".lock";

假设GetDataDir() 在类似Unix/Linux 的环境中以boost::filesystem::path 的形式返回/tmp/data。在类windows系统中,答案会有所不同。

这进一步扩展为:boost::filesystem::path pathLockFile = boost::filesystem::path("/tmp/data") / boost::filesystem::path(".lock");

最后你得到 pathLockFile 持有价值 /tmp/data/.lock


阅读来自Boost Filesystem and Path的文档

路径运算符/(const path& lhs, const path& rhs); 返回:路径(lhs)/= rhs。

路径附加 附加操作使用 operator/= 来表示它们在需要时附加平台首选目录分隔符的语义效果。 首选目录分隔符是实现定义的。

/(正斜杠)分隔符 => 适用于 unix 变体、Linux 和 Mac OS X\(反斜杠)分隔符 => 适用于类 windows实现

路径&运算符/=(常量路径&p); 返回:*this

【讨论】:

operator/operator/= 是否等效且可互换? @Åsmund 来自提升 documentation path operator/ (const path& lhs, const path& rhs); Returns: path(lhs) /= rhs. 所以 / 在内部使用 /=。不同之处在于/ 返回一个新的path 对象,而/= 不返回一个新对象。所以它们在这个意义上是不可互换的。

以上是关于boost::filesystem::path 中的“/”字符有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

如何转换`boost :: filesystem :: path`和`QString`?

boost::filesystem::path::lexically_normal: 这是不正确的行为吗?

错误:'boost::filesystem::path::filename() const() + "/"' 中的'operator+' 不匹配

从'boost::filesystem3::path'到非标量类型'std::string'的提升错误转换

使用简单 Ls.cpp 的 C++ Boost 编译错误 - 未定义对 boost::filesystem::path::filename 的引用

为 cmake 添加 boost 编译库