在这个问题中,我考虑了_Not_fn
调用包装程序的libstdc++ implementation。
它定义了四个函数调用操作符重载,如下所示:
不难看出,noexcept规范设置为:
其中__inv_res_t
是别名模板:
_S_not
是静态成员函数模板:
现在,按照noexcept规范背后的逻辑,我得出结论:
_S_not<__inv_res_t<_Fn _QUALS, _Args...>>
具有相同的noexcept规范。 _S_not<__inv_res_t<_Fn _QUALS, _Args...>>
是否标记为noexcept取决于是否对std::__invoke(...)
结果施加否定。 从我的 Angular 来看,此noexcept规范不涉及包裹在
not_fn
中的可调用对象在传递给not_fn
函数调用运算符的一组特定参数调用时可能会或可能不会自身抛出的情况。换句话说,不会检查函数调用操作符中的std::__invoke(...)
本身是否可能抛出。我在实现过程中会错过什么吗?
cppreference.com的实现有一个更简单的noexcept规范。但是,由于known issue,该实现不适用于最新的g++。
最佳答案
实际上,并没有要求not_fn
传播noexcept
。它在[func.not_fn]中指定,四个调用运算符的每个看起来都像这样:
没有noexcept
。就是说,P0356建议添加它,并且当前的noexcept
说明符没有意义,并且可能由于错误而造成伤害,因此将其提交给87538。
更新:此问题已在7.4、8.3和9.1中修复。
关于c++ - _Not_fn函数调用运算符的noexcept指定符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52673235/