我在尝试保持原子time_point时遇到了这个问题, see(atomic如果默认构造函数可用,则需要noexcept默认构造函数): http://cplusplus.github.io/LWG/lwg-active.html#2165
简单的问题是std :: atomic或类似的将无法在当前标准下编译。
考虑到std :: chrono :: clock_type :: now()s是noexcept。 似乎奇怪的是,时间点本身并非如此。
答案 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
构造函数。
这一切都是可行的。我只是将其原型化以确认我在这个答案中确实提供了很好的信息。然而,为了使这一切成为标准,必须:
迄今为止,委员会已经非常谨慎地应用条件<chrono>
。
标题中问题的答案很简单:
没有人把所有这些工作都投入其中。不过我会鼓励 人们这样做。我相信这会使客户受益 {{1}}。