无法在C++20中使用std::format。

26

我一直在尝试使用C++20中包含的std::format函数。据我所知,clang 14应该支持此功能,但由于某种原因,我收到以下错误:no member named 'format' in namespace 'std'。根据cppreference的编译器支持图表,clang应该支持文本格式化,但我仍然收到此错误。我不知道问题出在哪里。


2
你是否通过命令行告诉编译器你想使用C++20标准? - Bathsheba
命令行参数是 -std=c++20。(如果没有给出 -std 参数,我不确定编译器默认使用哪个标准。) - Scheff's Cat
1
请注意,您可能需要使用-stdlib=libc++指定Clang标准库。 - Some programmer dude
1
Clang可以使用libstdc++或libc++作为标准库实现。链接的页面显示,std::format在libc++中实现(当您将鼠标悬停在版本号上方时提到了限制),但在libstdc++中没有实现。您在使用Clang时使用哪个?假设两者都已安装,您可以使用-stdlib=libc++/-stdlib=libstdc++在它们之间切换。 - user17732522
3
看起来这部分是不完整的,并且默认情况下被禁用了:https://github.com/llvm/llvm-project/blob/329fda39c507e8740978d10458451dcdb21563be/libcxx/include/format#L123 https://godbolt.org/z/6r4bTh8hj - Alan Birtles
显示剩余4条评论
2个回答

22

7
根据这个,Clang应该支持文本格式化。如果仔细观察,可以看到那个单元格中有一个星号:14*。下面写着:*-将鼠标悬停在版本号上可查看注释。当您悬停在上面时,它会显示:“该论文已实现但仍标记为不完整的功能。尚未实施的LWG问题将导致API和ABI破坏。”未完成的功能不是默认启用的,这是未说的。但这很有道理,因为他们不希望用户依赖于会破坏的API / ABI。我认为,就像这个问题所证明的那样,使用绿色来表示此单元格是具有误导性的。最好在主要的语言实现中使用第三方格式库,直到文本格式化的标准实现是完整、稳定且非实验性的。其他注意事项如下:必须包括定义std::format的头文件。Clang默认不使用C++20,因此必须明确指定。在Linux上,Clang默认使用libstdc++标准库(与共享库兼容),因此在这种情况下,您将不会默认使用Clang的标准库,而且libstdc++尚未实现文本格式化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接