来自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上的值返回。这有一个有趣的原因吗?
答案 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引用传递。