From 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
For wstring() it is exactly the other way around - returning by reference on Windows and by value on POSIX. Is there an interesting reason for that?
boost::filesystem::path is the central class in Boost. Filesystem for representing and processing paths. Definitions can be found in the namespace boost::filesystem and in the header file boost/filesystem. hpp . Paths can be built by passing a string to the constructor of boost::filesystem::path (see Example 35.1).
The Boost Filesystem Library provides portable facilities to query and manipulate paths, files, and directories. The motivation for the library is the need to be able to perform portable script-like operations from within C++ programs.
On Windows, path
stores a wstring
, since the only way to handle Unicode-encoded paths in Windows is with UTF-16. On other platforms, the filesystems handle Unicode via UTF-8 (or close enough), so on those platforms, path
stores a string
.
So on non-Windows platforms, path::string
will return a const-reference to the actual internal data structure. On Windows, it has to generate a std::string
, so it returns it by copy.
Note that the File System TS bound for C++17 does not do this. There, path::string
will always return a copy. If you want the natively stored string type, you must use path::native
, whose type will be platform-dependent.
For windows API it returns by value because the variable 'm_pathname' needs to be converted into a different format (string) as implemented by 'path_traits'. This introduces a temporary variable which of course cannot be passed by reference, though the extra copy will get elided by either NRVO or by implicit move.
For the posix case, the format of 'm_pathname' is already in native format (string), so no need to convert and hence can be passed as const reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With