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