2

查看此 cppreference.com 页面std::filesystem::path::filename该方法的描述实际上只是“等效于relative_path().empty() ? path() : *--end()”。我从未见过这种语法“*--end()”。我可以从上下文中弄清楚它的作用,但它到底是什么意思?并且可以在不同的上下文中使用它来提取子字符串吗?

4

1 回答 1

2

首先,让我们看一下std::filesystem::path::begin()/end()。这允许您一次遍历一个目录的路径,因此/user/kenyn/foo.bar使用以下代码:

fs::path p = "/user/kenyn/foo.bar";
for(auto &e : p)
    std::cout << e << '\n';

我们会看到:

user
kenyn
foo.bar

那么,什么是*(--(p.end()))?我添加了额外的括号,因此我们可以看到我们得到了一个迭代器,它指向最后一个元素之后的p.end()一个,用 向后移动一个--以获取对 的引用foo.bar,然后取消对迭代器的引用*以给我们一个指向最终路径元素的指针"foo.bar"

完整的表达式,然后:

relative_path().empty() ? path() : *--end()

表示如果没有相对路径(即,只有一个文件名或什么都没有),则返回整个内容,否则如果有相对路径,则返回路径列表的最后一个元素,这将是文件名。

于 2019-10-18T00:10:02.440 回答