为什么boost :: filesystem :: path :: string()在Windows上按值返回,在POSIX上按引用返回?

时间:2016-05-30 15:53:55

标签: c++ boost boost-filesystem

来自boost / filesystem / path.hpp:

#   ifdef BOOST_WINDOWS_API
    const std::string string() const
    {
      [...]
    }
#   else   // BOOST_POSIX_API
    //  string_type is std::string, so there is no conversion
    const std::string&  string() const { return m_pathname; }
    [...]
#   endif

对于wstring(),它恰恰相反 - 通过Windows上的引用和POSIX上的值返回。这有一个有趣的原因吗?

2 个答案:

答案 0 :(得分:8)

在Windows上,path存储wstring,因为在Windows中处理Unicode编码路径的唯一方法是使用UTF-16。在其他平台上,文件系统通过UTF-8(或足够接近)处理Unicode,因此在这些平台上,path存储string

因此,在非Windows平台上,path::string将返回对实际内部数据结构的const引用。在Windows上,它必须生成std::string,因此它将通过副本返回。

请注意,绑定到C ++ 17的File System TS不会这样做。在那里,path::string将始终返回副本。如果您想要本机存储的字符串类型,则必须使用path::native,其类型将取决于平台。

答案 1 :(得分:1)

对于Windows API,它按值返回,因为变量' m_pathname'需要转换为由' path_traits'实现的不同格式(字符串)。这引入了一个临时变量,当然不能通过引用传递,尽管额外的副本将被NRVO或隐式移动所取代。

对于posix情况,' m_pathname'的格式已经是原生格式(字符串),因此无需转换,因此可以作为const引用传递。