10

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

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

考虑到 std::chrono::clock_type::now() 没有例外。时间点本身并非如此,这似乎很奇怪。

4

1 回答 1

9

在我看来,他们应该是有条件 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类似的严谨性处理构造函数。

这都是可行的。我刚刚对其进行了原型设计,以确认我实际上在这个答案中提供了很好的信息。但是,要使这一切成为标准,必须:

  1. 实施并全面测试整个事情。
  2. 写一份提案,令人信服地证明这是可实施的,并且对客户有价值。
  3. 参加标准会议并提出此提案,并具有说服力。
  4. 当委员会在你的论点中发现漏洞时(他们会),修复实施,修复提案,然后返回步骤 3。
  5. 继续执行第 3 步和第 4 步,直到委员会厌倦了听取您的意见,以至于他们放弃并投票将其纳入标准草案。
  6. 等待草案成为正式标准,并在等待期间保护提案不被投票出标准。

迄今为止,委员会noexcept对功能的应用条件非常谨慎。

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

没有人将所有这些工作都投入其中。但是,我会鼓励人们这样做。我相信这将有利于客户 <chrono>

于 2014-05-19T00:46:18.900 回答