为什么 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'的格式已经是原生格式(字符串),所以不需要转换,因此可以作为常量引用传递。
来自 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'的格式已经是原生格式(字符串),所以不需要转换,因此可以作为常量引用传递。