我在尝试保持原子时间点时遇到了这个问题,请参阅(如果默认构造函数可用,原子需要 noexcept 默认构造函数): http ://cplusplus.github.io/LWG/lwg-active.html#2165
简单的问题是 std::atomic 或类似的将无法在当前 std 下编译。
考虑到 std::chrono::clock_type::now() 没有例外。时间点本身并非如此,这似乎很奇怪。
我在尝试保持原子时间点时遇到了这个问题,请参阅(如果默认构造函数可用,原子需要 noexcept 默认构造函数): http ://cplusplus.github.io/LWG/lwg-active.html#2165
简单的问题是 std::atomic 或类似的将无法在当前 std 下编译。
考虑到 std::chrono::clock_type::now() 没有例外。时间点本身并非如此,这似乎很奇怪。
在我看来,他们应该是有条件 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>
。