std::filesystem::path 和 std::string 之间的隐式转换,应该发生吗?
Implicit conversion between std::filesystem::path and std::string, should it happen?
std::filesystem::path
的 cppreference 页面指出:
Paths are implicitly convertible to and from std::basic_strings
, which makes it possible to use them with over files APIs, e.g. as an argument to std::ifstream::open
现在到 std::filesystem::path
的转换很容易看到,因为它有一个采用 std::string
类型的非显式构造函数。不过,我似乎找不到的是一种隐式进入 std::string
的方法。
有一个string
函数,但是是std::string string() const;
,不是operator std::string()
。使用
#include <filesystem>
void foo(std::string) {}
int main()
{
namespace fs = std::filesystem;
fs::path p1;
foo(p1);
}
此代码在 icc, gcc, and clang, but not with MSVS 下编译良好,但给出错误:
example.cpp
<source>(10): error C2664: 'void foo(std::string)': cannot convert argument 1 from 'std::filesystem::path' to 'std::string'
<source>(10): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Compiler returned: 2
那么,哪个编译器是正确的?是否存在隐式转换序列,或者编译器只是有帮助?
所有的编译器都是对的。它是 specified by the standard 它应该转换为 string_type
:
operator string_type() const;
Returns: native()
.
string_type
这里是:
using string_type = basic_string<value_type>;
和native()
:
const string_type& native() const noexcept;
Returns: The pathname in the native format.
原生格式为 basic_string<value_type>
。
然而 value_type
不一定是 char
,因此向 std::string
的转换并不总是存在。只强制要求 basic_string<>
存在。
存在到 std::basic_string<value_type>
的隐式转换,其中 value_type
是依赖于 OS 的字符类型。
并且,(我的草稿中的§30.10.8,n4659)
For POSIX-based operating systems, value_type is char
[...]
For Windows-based operating systems, value_type is wchar_t
[...]
因此不需要在 Windows 上隐式转换为 std::string
,只需隐式转换为 std::wstring
。
std::filesystem::path
的 cppreference 页面指出:
Paths are implicitly convertible to and from
std::basic_strings
, which makes it possible to use them with over files APIs, e.g. as an argument tostd::ifstream::open
现在到 std::filesystem::path
的转换很容易看到,因为它有一个采用 std::string
类型的非显式构造函数。不过,我似乎找不到的是一种隐式进入 std::string
的方法。
有一个string
函数,但是是std::string string() const;
,不是operator std::string()
。使用
#include <filesystem>
void foo(std::string) {}
int main()
{
namespace fs = std::filesystem;
fs::path p1;
foo(p1);
}
此代码在 icc, gcc, and clang, but not with MSVS 下编译良好,但给出错误:
example.cpp
<source>(10): error C2664: 'void foo(std::string)': cannot convert argument 1 from 'std::filesystem::path' to 'std::string'
<source>(10): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Compiler returned: 2
那么,哪个编译器是正确的?是否存在隐式转换序列,或者编译器只是有帮助?
所有的编译器都是对的。它是 specified by the standard 它应该转换为 string_type
:
operator string_type() const;
Returns:
native()
.
string_type
这里是:
using string_type = basic_string<value_type>;
和native()
:
const string_type& native() const noexcept;
Returns: The pathname in the native format.
原生格式为 basic_string<value_type>
。
value_type
不一定是 char
,因此向 std::string
的转换并不总是存在。只强制要求 basic_string<>
存在。
存在到 std::basic_string<value_type>
的隐式转换,其中 value_type
是依赖于 OS 的字符类型。
并且,(我的草稿中的§30.10.8,n4659)
For POSIX-based operating systems, value_type is
char
[...]
For Windows-based operating systems, value_type iswchar_t
[...]
因此不需要在 Windows 上隐式转换为 std::string
,只需隐式转换为 std::wstring
。