30 Input/output library [input.output]

30.10 File systems [filesystems]

30.10.27 Class path [fs.class.path]

30.10.27.4 path members [fs.path.member]

30.10.27.4.11 path generation [fs.path.gen]

path lexically_normal() const;

Returns: Путь, имя которого в универсальном формате normal form совпадает с именем пути в универсальном формате *this.

[Example:

assert(path("foo/./bar/..").lexically_normal() == "foo/");
assert(path("foo/.///bar/../").lexically_normal() == "foo/");

Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ] end example

path lexically_relative(const path& base) const;

Returns: *this сделано относительно base. Нет resolve символических ссылок. Не первое normalize *this или base.

Effects: Если root_­name() != base.root_­name() есть true или is_­absolute() != base.is_­absolute() есть true или !has_­root_­directory() && base.has_­root_­directory() есть true, возвращается path(). Определяет первый несовпадающий элемент *this и base как будто по:

auto [a, b] = mismatch(begin(), end(), base.begin(), base.end());

Потом,

  • если a == end() и b == base.end(), возвращается path("."); иначе

  • пусть n будет количество filenameэлементов [b, base.end()) , которых нет, dot или dot-dot минус количество, которые есть dot-dot. Если n<0, возвращается path(); иначе

  • возвращает объект класса path , созданный по умолчанию, за которым следует

    • приложение operator/=(path("..")) n времен, а затем

    • применение operator/= для каждого элемента в [a, end()).

[Example:

assert(path("/a/d").lexically_relative("/a/b/c") == "../../d");
assert(path("/a/b/c").lexically_relative("/a/d") == "../b/c");
assert(path("a/b/c").lexically_relative("a") == "b/c");
assert(path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
assert(path("a/b/c").lexically_relative("a/b/c") == ".");
assert(path("a/b").lexically_relative("c/d") == "../../a/b");

Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ]end example

[ Note: Если требуется символическая ссылка, следующая за семантикой, используйте операционную функцию relative(). ] end note

[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_­normal() к *this, baseили обоих. ] end note

path lexically_proximate(const path& base) const;

Returns: Если значение lexically_­relative(base) не является пустым путем, верните его. В противном случае вернитесь *this.

[ Note: Если требуется символическая ссылка, следующая за семантикой, используйте операционную функцию proximate(). ] end note

[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_­normal() к *this, baseили обоих. ] end note