当前位置: 首页 > 知识库问答 >
问题:

STD::FileSystem::Path和STD::String之间的隐式转换是否应该发生?

哈沛
2023-03-14

路径与std::basic_strings之间可以隐式转换,这使得可以将它们与over files API一起使用,例如作为std::ifstream::open的参数

现在很容易看到到std::filesystem::path的转换,因为它有一个接受std::string类型的非显式构造函数。但是,我似乎找不到隐式地转到std::string的方法。

有一个string函数,但它是std::string string()常量;,而不是操作符std::string()。使用

#include <filesystem>

void foo(std::string) {}

int main()
{
    namespace fs = std::filesystem;
    fs::path p1;
    foo(p1);
}

这段代码可以很好地编译icc、gcc和clang,但不能编译MSVS,在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

那么,哪个编译器是对的呢?是否存在隐式转换序列,或者编译器只是有所帮助?

共有1个答案

蒋嘉颖
2023-03-14

这里有一个到std::basic_string 的隐式转换,其中value_type是操作系统相关的字符类型。

并且,(§30.10.8,在我的草稿中,n4659)

对于基于POSIX的操作系统,value_type是char[...]
对于基于Windows的操作系统,value_type是wchar_t[...]

 类似资料:
  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • 问题内容: “隐式转换”和“显式转换”有什么区别?Java和C ++的区别是否不同? 问题答案: 显式转换是您使用某种语法 告诉 程序进行转换的地方。例如(在Java中): 隐式转换是在没有任何语法的情况下进行转换的地方。例如(在Java中): 应该注意的是(在Java中)涉及原始类型的转换通常涉及某种表示形式的更改,并且可能导致精度降低或信息丢失。相比之下,仅涉及引用类型的转换不会更改基本表示形

  • 我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s

  • 下面的代码显示了我要做的:

  • 并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动