filesystem::operator/ boost和std的不同行为



我正试图从boost::filesystem端口到std::filesystem。在这个过程中,我遇到了一些代码,其中booststd似乎以不同的方式表现。

下面的代码显示了该行为:

#include <iostream>
#include <filesystem>
#include <boost/filesystem.hpp>
template<typename T>
void TestOperatorSlash()
{
const std::string foo = "Foo";
const std::string bar = "Bar";
const T start = "\";
std::string sep;
sep += T::preferred_separator;
const auto output = start / (foo + bar) / sep;
std::cout << output << 'n';
}
int main(int argc, char** argv)
{
TestOperatorSlash<std::filesystem::path>();
TestOperatorSlash<boost::filesystem::path>();
}

代码输出:

"\"
"FooBar"

我的预期行为是boost之一,我不明白std::filesystem发生了什么。

为什么我得到"\"?为什么pathoperator/booststd中的行为不同?

编辑:

在理解了std::filesystem::operator/的行为动机并给出了这个问题的答案后,当我有一个绝对路径时,我决定使用path::relative_path()函数作为operator/的第二个参数。

这样我可以模仿boost::filesystem的行为。例如:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main(int argc, char** argv)
{
fs::path foo = "\foo";
fs::path bar = "\bar";
auto foobar0 = foo / bar;                   // Evaluates to \bar
auto foobar1  = foo / bar.relative_path();  // Evaluates to \foo\bar
}

Boost将合并多余的分隔符。

https://www.boost.org/doc/libs/1_68_0/libs/filesystem/doc/reference.html path-appends

将path::preferred_separator附加到pathname,转换格式和如果需要进行编码([path.arg.convert]),除非:

an added separator would be redundant, ...

而std::filesystem在/的第二个参数中看到一个前导分隔符,作为替换部分或全部原始路径的指令:

https://en.cppreference.com/w/cpp/filesystem/path/append

path("C:foo") / "/bar";  // yields "C:/bar"        (removes relative path, then appends)

你想:

const auto output = start / (foo + bar) / "";

?

相关内容

  • 没有找到相关文章

最新更新