gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:18 25 4
gpt4 key购买 nike

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

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

考虑到 std::chrono::clock_type::now() 是无异常(exception)的。时间点本身不是,这似乎很奇怪。

最佳答案

在我看来,它们应该是有条件的 noexcept .为了描述正确的条件,我们需要备份和讨论 duration 的构造函数.

首先是特殊构造函数:默认和复制。

这些构造函数被正确指定为 = 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具有类似严谨性的构造函数。

这一切都是可行的。我刚刚制作了它的原型(prototype),以确认我实际上在这个答案中提供了很好的信息。然而,要使这一切成为标准,必须:

  1. 实现并全面测试整个过程。
  2. 撰写一份提案,令人信服地论证这是可以实现的,并且对客户有值(value)。
  3. 参加标准 session 并提出此提案,并具有说服力。
  4. 当委员会发现您的论点存在漏洞时(他们会的),修复实现,修复提案,然后返回到第 3 步。
  5. 继续执行第 3 步和第 4 步,直到委员会厌倦了听到您的消息,他们屈服并将其投票成为标准草案。
  6. 等待草案成为正式标准,并在等待期间保护提案不被投票淘汰。

迄今为止,委员会已申请有条件的 noexcept极其节制地发挥作用。

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

No one has put all this work into it. However I would encourage people to do so. I believe this would benefit the clients of <chrono>.

关于c++ - std::chrono::...::time_point 上的构造函数应该是 noexcept 吗? (或者他们为什么不呢?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com