为什么N3421不提供noexcept限定符?

gnz*_*lbg 4 c++ function-object c++-standard-library c++14

N3421中 - 使运算符函数更大<>,std函数对象的新特化是:

template <> struct plus<void> {
  template <class T, class U> auto operator()(T&& t, U&& u) const
  -> decltype(std::forward<T>(t) + std::forward<U>(u));
};
Run Code Online (Sandbox Code Playgroud)

代替

template <> struct plus<void> {
  template <class T, class U> auto operator()(T&& t, U&& u) const
  noexcept(noexcept(decltype(std::forward<T>(t) + std::forward<U>(u))
                     (std::move(std::forward<T>(t) + std::forward<U>(u)))))
  -> decltype(std::forward<T>(t) + std::forward<U>(u));
};
Run Code Online (Sandbox Code Playgroud)
  • 这有什么理由吗?
  • noexcept在这个用例中是否遗漏了问题?

编辑:链接到github中的工作草稿行.

编辑2:链接到libc ++ plus specialization.

Pup*_*ppy 6

现有的LWG指南不鼓励使用noexcept.他们不接受宽合约职能,只有窄合约职能.我不记得究竟是如何定义这些术语的,但我可以告诉你,我出席了布里斯托尔会议的讨论noexcept,他们拒绝将其置于一个功能上,因为它是宽合同,我认为这是疯狂的.

由于两个原因之一,它可能不在这里.首先,委员会和论文作者尚未习惯noexcept在每种情况下都考虑- 类似于constexpr.在这种情况下,论文作者(STL)可能只是忘了添加它.

第二个问题是LWG对他们何时接受会有一些疯狂的过度限制noexcept.

  • 委员会的意图是允许供应商在他们希望的情况下添加noexcept.来自n3797 17.6.5.12异常处理的限制:"实现可以通过添加非抛出noexcept规范来强化非虚函数的异常规范." (2认同)