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

时间:2014-03-27 23:54:41

标签: c++ atomic chrono noexcept

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

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

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

1 个答案:

答案 0 :(得分:5)

以我的拙见,他们应该有条件地 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);

这些目前不是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))); 。例如:

Rep

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

为了使这些构造函数真正起作用,成员函数noexcept需要有条件地duration_cast,并且函数noexcept需要有条件地time_point

现在(现在),人们可以开始以类似的严谨性来处理noexcept构造函数。

这一切都是可行的。我只是将其原型化以确认我在这个答案中确实提供了很好的信息。然而,为了使这一切成为标准,必须:

  1. 实施并全面测试整个事情。
  2. 撰写提案,令人信服地辩称这是可实施的,对客户有价值。
  3. 参加标准会议并提出此建议,并说服力。
  4. 当委员会在你的论点中发现漏洞(他们会)时,修复实施,修改提案,然后回到第3步。
  5. 继续执行第3步和第4步,直到委员会对您的回应感到厌倦,他们将其投入并投票给标准草案。
  6. 等待草案成为官方标准,并保护提案不会在等待时退出标准。
  7. 迄今为止,委员会已经非常谨慎地应用条件<chrono>

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

      

    没有人把所有这些工作都投入其中。不过我会鼓励   人们这样做。我相信这会使客户受益   {{1}}。