【发布时间】:2013-08-07 17:26:04
【问题描述】:
这与my previous question 有关,我问std::chrono::steady_clock::now 是否应该是noexcept。现在我知道我应该想知道这个函数如何报告错误?例如,此函数在 Linux 上的常见实现使用
clock_gettime 可以返回错误。
【问题讨论】:
标签: c++ c++11 error-handling chrono
这与my previous question 有关,我问std::chrono::steady_clock::now 是否应该是noexcept。现在我知道我应该想知道这个函数如何报告错误?例如,此函数在 Linux 上的常见实现使用
clock_gettime 可以返回错误。
【问题讨论】:
标签: c++ c++11 error-handling chrono
Linux clock_gettime 工具可能报告的所有错误在std::chrono::steady_clock::now() 的调试实现中都不可能出现。
错误是:
int clock_gettime(clockid_t clk_id, struct timespec *tp);
EFAULT
tp 指向可访问地址空间之外。
在std::chrono::steady_clock::now() 中没有用户提供的tp 出错。如果std::chrono::steady_clock::now() 将错误的tp 传递给clock_gettime,这只是steady_clock 中的一个容易修复的错误。
EINVAL
此系统不支持指定的 clk_id。
在std::chrono::steady_clock::now() 中没有用户提供的clk_id 出错。如果std::chrono::steady_clock::now() 将错误的clk_id 传递给clock_gettime,这只是steady_clock 中的一个bug,必须修复。
请注意,steady_clock 的实现不能保证是可移植的,并且可能必须移植到任何给定平台并进行正确性测试。在某些平台上,steady_clock 可能无法以clock_gettime 的形式实现。
EPERM
clock_settime() 无权设置指示的时钟。
不适用于steady_clock,因为没有设置时间的API。
【讨论】:
它没有。 API 中没有提供错误报告。因此,Linux 实现必须要么在内部处理错误,要么不返回(例如,通过exit() 或std::terminate())。
【讨论】:
steady_clock 的单调要求。我不知道是否有任何实现真正做到这一点。
time_point 的值以相对稳定的速率前进的要求实时。”从 20.11.7.2/1 [time.clock.steady] 开始。