Poco :: Path使用const wchar_t *进行编译,但行为异常

时间:2017-11-14 08:00:55

标签: c++ poco-libraries wstring

使用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中):

  

\

而不是预期的:

  

C:\ TEMP

审核Poco::Path文档时,我看到没有构造函数期望std::wstring(这就是第一条路径失败的原因),const wchar_t*,只有std::stringconst char*(都是UTF-8)。

如何使用const wchar_t*进行编译以及为什么出现意外输出(错误的路径)?

1 个答案:

答案 0 :(得分:3)

为此问题创建mvce时,我发现了问题所在。我决定在这里记录它,以防它对其他人有帮助。

问题中显示的代码段是一个巨大项目的一部分,所以我错过了编译警告:

  

警告C4800:'const wchar_t *':强制值为bool'true'或'false'(性能警告)

然后我意识到有一个构造函数Poco::Path::Path(bool absolute),并且编译器自动将指针转换为bool,然后产生意外行为。输出的\对应于空的绝对路径,它是使用这种构造函数时的初始值。

对于那些对解决方案感兴趣的人,我现在使用的是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));