我正在尝试使用新的 C++20 chrono 库,更具体地说是新的
clock_cast
。
如果我使用 clang++ 在 Linux 上编译
16.0.6
,它会按预期工作。error: no member named 'clock_cast' in namespace 'std::chrono'
Clang 在 Mac 上是版本
17.0.5
,所以我希望实现 chrono 库,我需要添加另一个包含吗?铿锵版本:
Homebrew clang version 17.0.5
Target: arm64-apple-darwin23.1.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin
也尝试使用默认的 xcode clang 版本,同样的错误。
最小可重现示例:
#include <chrono>
int main() {
auto time = std::chrono::high_resolution_clock::now();
auto system_time = std::chrono::clock_cast<std::chrono::system_clock>(time);
}
编译选项:
/opt/homebrew/opt/llvm/bin/clang++ -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGEFILE_SOURCE -isystem /opt/homebrew/Cellar/openssl@3/3.1.4/include -std=gnu++20 -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX14.0.sdk -fPIC -o test.cpp.o -c test.cpp
尚未实施。
这是 C++20 的 libc++ 状态页面:
https://libcxx.llvm.org/Status/Cxx20.html
相关行是:
P0355R7 LWG 将计时扩展到日历和时区 Jacksonville Partial [9]
脚注是:
[9] P0355:实施状态为:
- 日历主要在 Clang 7 中完成
- 输入解析器未完成
- 流输出由于 P1361R2 已过时 “计时与文本格式的集成”
- 时区和闰秒正在进行中
- TAI时钟未完成
- GPS时钟未完成
- UTC 时钟未完成
请注意:
auto time = std::chrono::high_resolution_clock::now();
auto system_time = std::chrono::clock_cast<std::chrono::system_clock>(time);
永远不会可移植地工作,因为
high_resolution_clock
和system_clock
之间没有明确的关系。在 gcc 上,这些是相同的时钟,因此 clock_cast
仅执行恒等转换。在 libc++ 上,high_resolution_clock
与 steady_clock
相同,并且 steady_clock
与 system_clock
没有定义的关系。
clock_cast
将在以下各项之间执行转换: system_clock
、utc_clock
、tai_clock
、gps_clock
、file_clock
,以及定义这些静态成员函数对之一的任何用户定义时钟:
to_sys
from_sys
或
to_utc
from_utc
请参阅此答案(“C++20 更新”部分),了解参与
clock_cast
基础设施的用户定义时钟的示例。