为什么 boost::filesystem::path::string() return 按 Windows 上的值和 POSIX 上的引用?

Why does boost::filesystem::path::string() return by value on Windows and by reference on POSIX?

来自 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 上按值返回。这有什么有趣的原因吗?

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

因此在非Windows 平台上,path::string 将return 一个对实际内部数据结构的常量引用。在 Windows 上,它必须生成一个 std::string,所以它 return 复制它。

请注意,C++17 的 File System TS 绑定不会执行此操作。在那里,path::string 将始终 return 一份。如果您想要本机存储的字符串类型,则必须使用 path::native,其类型将取决于平台。

对于 windows API 它 returns 按值,因为变量 'm_pathname' 需要转换为不同的格式(字符串),如 'path_traits'.这引入了一个临时变量,当然不能通过引用传递,尽管额外的副本将被 NRVO 或隐式移动删除。

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