【问题标题】:Can std::chrono::system_clock::now() throw an exception?std::chrono::system_clock::now() 可以抛出异常吗?
【发布时间】:2026-01-14 18:15:01
【问题描述】:

我想写一个非常便携的代码,我需要在初始化时调用std::chrono::system_clock::now()。这个函数能抛出异常吗?

在 c++11 标准中,没有提到这个问题。 (至少,我没有找到)

在 Visual Studio 中,源代码如下:

static time_point now() _NOEXCEPT
    {   // get current time
    return (time_point(duration(_Xtime_get_ticks())));
    }

使用 _NOEXCEPT 关键字,Visual Studio 中的答案非常明显。但是一般情况呢?

【问题讨论】:

  • 请注意:_NOEXCEPT 不是关键字。它是一个特定于实现的宏,对于支持它的编译器,它扩展为关键字 noexcept,对于不支持它的编译器,它什么也没有。
  • @PeteBecker 当然

标签: c++ c++11 portability language-lawyer chrono


【解决方案1】:

来自 §20.11.7.1

class system_clock {
public:
  ...
    static time_point now() noexcept;  
  ...
};

所以标准规定它不能抛出异常。

【讨论】:

  • 你有最终的 C++11 标准吗?我只有最新的草稿,在 20.11.7.1 我只有这个:static time_point now();
  • @Arnaud:AFAIK 的最新草案是 n3485,noexcept 在那里
  • @AndyProwl 非常感谢!我不知道我使用的是非常旧的草稿。我真的以为我下载了最新的。
  • @AndyProwl 恕我直言 n3485 是下一个标准的草案。我现在使用的是 n3337(它也是下一个标准的草案,但基于当前标准,只进行了错字更正)而不是 n3242(它是旧的并且缺少大多数 noexcept 关键字)
  • @Arnaud:好的,很高兴它有帮助!是的,在标准之前之后草稿以了解实际发生的变化可能是一个好主意。我不知道 n3337,谢谢
【解决方案2】:

这个函数可以抛出异常吗?

,不能。

根据 C++11 标准的第 20.11.7/1 段,system_clock 必须满足 TrivialClock 要求。

此外,根据第 20.11.3/4 段,满足TrivialClock 要求的时钟的now() 成员函数不得抛出:

如果满足以下条件,则类型 TC 满足 TrivialClock 要求:

[...]

——函数TC::now()不会抛出异常,并且

[...]

【讨论】: