Poco::Path компилируется с const wchar_t*, но ведет себя неожиданно

Работая с Poco::Path, я обнаружил очень любопытную ошибку. См. следующий код:

#include <iostream>
#include <string>
#include <Poco/Path.h>

int main()
{
  std::wstring a_path = L"c:\\temp";

  //Poco::Path from_wstring(a_path); // ERROR: fails to compile, expected
  Poco::Path from_wchar_t(a_path.c_str()); // compiles... unexpected

  std::cout << from_wchar_t.toString() << std::endl;

  return 0;
}

Но вывод вышеуказанной программы (в Windows):

\

вместо ожидаемого:

с:\темп

Просматривая документацию Poco::Path, я не вижу конструктора, ожидающего std::wstring (поэтому первый путь терпит неудачу) или const wchar_t*, только от std::string и const char* (оба UTF-8).

Как это компилируется с const wchar_t* и почему неожиданный вывод (неправильный путь)?


person cbuchart    schedule 14.11.2017    source источник


Ответы (1)


При создании mvce для этого вопроса я понял проблему. Я решил задокументировать это здесь, на случай, если это будет полезно для кого-то еще.

Фрагмент кода, показанный в вопросе, является частью огромного проекта, поэтому я пропустил предупреждение о компиляции:

предупреждение C4800: 'const wchar_t *': принудительное значение bool 'true' или 'false' (предупреждение о производительности)

Затем я понял, что есть конструктор Poco::Path::Path(bool absolute) и что компилятор автоматически выполняет приведение от указателя к логическому значению, что приводит к неожиданному поведению. \ вывода соответствует пустому абсолютному пути, его начальному значению при использовании такого конструктора.


Для тех, кто заинтересован в обходном пути, я сейчас использую преобразование UTF-16 в UTF-8:

#include <boost/locale/encoding.hpp>
// ...
std::wstring a_path = L"c:\\temp";
Poco::Path utf8_path(boost::locale::conv::utf_to_utf<char>(a_path));
person cbuchart    schedule 14.11.2017
comment
Для справки в будущем: все интерфейсы POCO (кроме, очевидно, конверсионных) ожидают строки UTF-8. О любых преобразованиях заботятся внутренне, если это необходимо. - person Alex; 15.11.2017