如何让 g++ 编译 chrono 输出?

Alg*_*ous 1 c++ g++ c++-chrono

我想在控制台中打印一个计时时间点,并且我发现了以下 stackoverflow 问题:

\n

如何打印 C++11 time_point?

\n

其中一个答案(How do you print a C++11 time_point?)指出,在 C++20(现已发布一年多)中,可以将时间点放入输出命令中。不幸的是,我无法在我的机器上编译代码。我使用了以下命令进行编译:

\n

g++ -std=c++20 chrono5.cpp -o test

\n

我使用此命令是因为我读到直接输出需要 C++ 20 才能工作。

\n

文件“chrono5.cpp”包含与上面链接指向的答案(编辑)完全相同的代码,该代码实际上是由 chrono 库的创建者 Howard Hinnant 编写的。我究竟做错了什么?

\n

错误消息非常长,因此我可能不应该完整包含它,但这是它的开头:

\n
chrono5.cpp:7:15: error: no match for \xe2\x80\x98operator<<\xe2\x80\x99 (operand types are \xe2\x80\x98std::ostream\xe2\x80\x99 {aka \xe2\x80\x98std::basic_ostream<char>\xe2\x80\x99} and \xe2\x80\x98std::chrono::_V2::system_clock::time_point\xe2\x80\x99 {aka \xe2\x80\x98std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >\xe2\x80\x99})\n    7 |     std::cout << std::chrono::system_clock::now() << " UTC\\n";\n      |     ~~~~~~~~~ ^~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |          |                                     |\n      |          |                                     std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >}\n      |          std::ostream {aka std::basic_ostream<char>}\n
Run Code Online (Sandbox Code Playgroud)\n

我的编译器是否支持此功能?预先非常感谢您!

\n

use*_*522 5

完成这项工作所需的重载operator<<是在 C++20 中通过提案P0355引入的,但该提案还包含更大的<chrono>库扩展。<chrono>它引入了图书馆以前没有的日历和时区的概念。这些对于例如像现在一样将时间点打印为日历日期和日期时间是必要的operator<<

由 chrono 库的创建者 Howard Hinnant 逐字编写

他设计了该库并编写了参考实现,但每个 C++ 实现仍然必须实现自己的库规范。

我的编译器是否支持此功能?预先非常感谢您!

它不是关于编译器支持,而是关于标准库支持。GCC 的一部分是 libstdc++,它包含标准库的实现。在 libstdc++ 的实现状态页面上,我之前提到的论文仍然被列为未在任何发布版本中实现。但正如 @Brian 在该问题下的评论中指出的那样,当前的 GCC 主干确实至少支持operator<<您此处所需的重载。

有关多个标准库实现的概述,您可以参阅https://en.cppreference.com/w/cpp/compiler_support#C.2B.2B20_library_features,其中当前列出了自 GCC 11 以来 libstdc++ 论文的部分实现,目标为完整下一个主要版本 GCC 13。

LLVM 的 libc++ 也被列为部分(自 LLVM/Clang 7 起),并且只有 MSVC 的实现在已发布版本中被列为当前完整的(自 16.10 起)。