std :: chrono :: ... :: time_point上的构造函数应该是noexcept吗?(或者他们为什么不呢?)

amu*_*ray 6 c++ atomic noexcept c++-chrono

我在尝试保持原子time_point时遇到了这个问题,请参阅(原子需要noexcept默认构造函数,如果默认构造函数可用):http://cplusplus.github.io/LWG/lwg-active.html#2165

简单的问题是std :: atomic或类似的将无法在当前std下编译.

考虑到std :: chrono :: clock_type :: now()s是noexcept.似乎奇怪的是,时间点本身并非如此.

How*_*ant 6

以我的拙见,他们应该是有条件的 noexcept.为了描述正确的条件,我们需要备份并讨论构造函数duration.

首先是特殊构造函数:default和copy.

这些构造函数已正确指定= default.这意味着,如果底层rep有特殊的noexcept构造函数,那么也是duration如此.这正是我们想要的.

那么怎么样:

template <class Rep2>
   constexpr explicit duration(const Rep2& r);
template <class Rep2, class Period2>
   constexpr duration(const duration<Rep2, Period2>& d);
Run Code Online (Sandbox Code Playgroud)

这些当前不是noexcept,但我们希望他们成为他们所称的结构noexcept.例如:

template <class Rep2>
   constexpr explicit duration(const Rep2& r)
       noexcept(is_nothrow_constructible<rep, Rep2 const&>{});
template <class Rep2, class Period2>
   constexpr duration(const duration<Rep2, Period2>& d)
       noexcept(noexcept(is_nothrow_copy_constructible<rep>{}) &&
                noexcept(std::chrono::duration_cast<duration>(d)));
Run Code Online (Sandbox Code Playgroud)

这意味着它们对于常见用例是不可能的.但是,如果你创建一个Rep算术模拟器,可能(例如)抛出溢出,那么这些构造函数将正确无法noexcept.

为了使这些构造函数真正起作用,成员函数count()需要有条件noexcept,并且函数duration_cast需要有条件地进行noexcept.

现在(也是现在),人们可以开始以time_point类似的严谨性来解决构造函数.

这一切都是可行的.我只是将它原型化,以确认我在这个答案中确实提供了很好的信息.然而,为了使所有std,人们必须:

  1. 实施并全面测试整个事物.
  2. 撰写提案,令人信服地辩称这是可实施的,对客户有价值.
  3. 参加标准会议并提出此提案,并且具有说服力.
  4. 当委员会在你的论点中找到漏洞(他们会)时,修复实施,修复提案,然后回到第3步.
  5. 继续执行步骤3和步骤4,直到委员会对您的回复感到厌倦,他们将其投入并将其投入标准草案.
  6. 等待草案成为官方标准,并保护提案在等待时不被投票退出标准.

到目前为止,委员会已经noexcept非常谨慎地适用了有条不紊的职能.

标题中问题的答案很简单:

没有人把所有这些工作都投入其中.但是,我鼓励人们这样做.我相信这会使客户受益 <chrono>.