Почему std :: filesystem :: path :: compare () и boost :: filesystem :: path :: compare () различаются?

Учитывая следующий код:

  fs::path p{ "a/b/" };
  fs::path q{ "a/b/." };  
  assert(p == q);         

[Обратите внимание на дополнительную точку в конце строки, определяющей q.]

С учетом вышесказанного boost :: filesystem принимает p == q как истину, но реализация std :: filesystem в gcc и llvm говорит, что это ложь.

Почему расхождение между boost и std?

P.S. В предыдущих версиях этого вопроса я ошибочно думал, что пути должны быть нормализованы перед сравнением. Это не относится к делу. Несмотря на это, расхождение между boost и std все еще остается для меня загадкой.


person Curious    schedule 13.04.2020    source источник
comment
Почему вы ожидаете, что они будут сравнивать равных?   -  person T.C.    schedule 13.04.2020
comment
Точка относится к самой себе, так почему бы и нет?   -  person Zuodian Hu    schedule 13.04.2020
comment
намного лучше имхо. Может, мне стоит сказать вам, что, хотя меня что-то интересует, я ничем не могу помочь. Хотя, чтобы узнать, смогу ли я сначала попытаться понять вопрос. Извините, если я вызвал ложные ожидания, но если вы согласитесь, что это было улучшение, то, конечно, это было не для меня, а для вас, чтобы увеличить шансы получить ответ   -  person 463035818_is_not_a_number    schedule 14.04.2020
comment
Как я понимаю, сравнение надо делать после нормализации путей. Почему? Я бы сказал, что "a/b/" и "a/b/." - это разные пути, которые называют одну и ту же запись   -  person Caleth    schedule 14.04.2020
comment
@ Caleth: a) Первая причина, как я уже упоминал в вопросе, заключается в том, что a /.././ b и a ///..//.//// b сравнивают равные. Это разные пути, которые называют одну и ту же запись, если использовать ваш язык, но они сравниваются одинаково. Это означает, что происходит какая-то нормализация. б) Важно отметить, что Boost с вами не согласен.   -  person Curious    schedule 18.04.2020


Ответы (1)


Короткий ответ заключается в том, что . в Unix - это фактическая ссылка на узел файловой системы, и это иногда имеет значение. См. этот ответ о переполнении стека.

РЕДАКТИРОВАТЬ

Однако я не могу предположить, что знаю намерения Комитета по стандартам в отношении поведения библиотеки файловой системы, и не думаю, что для библиотеки разумно знать так много о поведении символических ссылок Unix. Короче говоря, это может быть, а может и не быть просто причудой стандартной формулировки и мнения Boost о том, как все должно работать.

person Zuodian Hu    schedule 14.04.2020
comment
Насколько я могу судить, сравнение путей выполняется без доступа к файловой системе. Боюсь, дело глубже. - person Curious; 14.04.2020
comment
@Curious: Сравнение путей выполняется без доступа к файловой системе Но сравнения путей должны быть определены таким образом, чтобы, если два пути равны, они обязательно должны были называть один и тот же объект в файловой системе. Если . в некоторых случаях может рассматриваться как другой объект, то проверка на равенство логических путей должна признать это. - person Nicol Bolas; 15.04.2020
comment
@ Никол Болас: Верно. Вот почему в стандарте есть правила для нормализации пути. В стандарте, например, вы можете ссылаться на: 29.11.7.1 Общий формат имени пути [fs.path.generic] и, в частности, на подраздел 6: Нормализация имени пути общего формата. Опять же, пожалуйста, обратитесь к моему сообщению полностью и к моему ответу Калету выше. В частности, мой последний момент: boost дает другой ответ. - person Curious; 15.04.2020