Почему std :: filesystem :: path :: append заменяет текущий путь, если p начинается с корневого пути - PullRequest
1 голос
/ 18 марта 2019

Ниже приведен код:

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
    fs::path fsBase = "/base";
    fs::path fsAppend = "/append";
    auto fsResult = fsBase / fsAppend;

    std::cout << "fsResult: " << fsResult << std::endl;
    return 0;
}

Обычно ожидаемый результат равен /base/append, но на самом деле он дает /append.

Описание fs :: path:: append указывает на это поведение:

Если p.is_absolute () ||(p.has_root_name () && p.root_name ()! = root_name ()), затем заменяет текущий путь на p, как если бы оператор = (p), и завершается.

Однако поведениеstd::experimental::filesystem и boost::filesystem отличается, что дает ожидаемый /base/append.См. примеры .

Вопрос в том, почему он так себя ведет?Почему он заменяет путь на функцию append()?

1 Ответ

4 голосов
/ 18 марта 2019

fsAppend - это абсолютный путь, поскольку он начинается с /, и вы находитесь в такой системе, как POSIX, где пути, начинающиеся с /, являются абсолютными.

Добавление одного абсолютного пути к другому абсолютномупуть не имеет никакого смысла (для меня создание исключения было бы самым естественным результатом на самом деле).Каким должен быть результат C:\foo.txt append C:\bar.txt?

В experimental::fs правило гласило: если второй аргумент .native() начинается с разделителя каталогов, то он обрабатывается как относительный путь для добавленияцелей, даже если это может быть абсолютный путь в других контекстах!

Стандартизированная файловая система четко отличает абсолютные пути от относительных путей, пытаясь избежать этой неоднозначности, возникающей в системах POSIX.

Запись об изменении можно найти в P0492R2 US77.

Обратите внимание, что вы можете использовать += вместо / для объединения (следует делать то, что вы ожидаете), или сделать второй аргумент относительным перед использованием /.

Также см. этот ответ для дальнейшего сравнения между experimental и завершенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...