Сначала давайте посмотрим на 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()
Говорит, что нет относительного пути (т. е. только имя файлаили вообще ничего), верните все целиком, иначе, если есть относительный путь, верните последний элемент списка путей, который будет именем файла.