gpt4 book ai didi

c++ - _Not_fn 函数调用运算符的 noexcept 说明符

转载 作者:行者123 更新时间:2023-11-30 03:20:43 27 4
gpt4 key购买 nike

在这个问题中,我考虑了 libstdc++ implementation_Not_fn调用包装器。

它定义了四种函数调用运算符重载如下:

 #define _GLIBCXX_NOT_FN_CALL_OP( _QUALS )                          \
template<typename... _Args> \
decltype(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()) \
operator()(_Args&&... __args) _QUALS \
noexcept(noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>())) \
{ \
return !std::__invoke(std::forward< _Fn _QUALS >(_M_fn), \
std::forward<_Args>(__args)...); \
}
_GLIBCXX_NOT_FN_CALL_OP( & )
_GLIBCXX_NOT_FN_CALL_OP( const & )
_GLIBCXX_NOT_FN_CALL_OP( && )
_GLIBCXX_NOT_FN_CALL_OP( const && )
#undef _GLIBCXX_NOT_FN_CALL

很容易看出,noexcept规范设置为:

noexcept(noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()))

哪里__inv_res_t是别名模板:

template<typename _Fn2, typename... _Args>
using __inv_res_t = typename __invoke_result<_Fn2, _Args...>::type;

_S_not是静态成员函数模板:

template<typename _Tp>
static decltype(!std::declval<_Tp>())
_S_not() noexcept(noexcept(!std::declval<_Tp>()));

现在,根据 noexcept 规范背后的逻辑,我得出结论:

  1. 函数调用运算符在概念上具有与 _S_not<__inv_res_t<_Fn _QUALS, _Args...>> 相同的 noexcept 规范。 .
  2. _S_not<__inv_res_t<_Fn _QUALS, _Args...>>被标记为 noexcept 取决于是否对 std::__invoke(...) 的结果应用否定不异常(exception)。

从我的角度来看,这个 noexcept 规范没有涵盖可调用对象包装到 not_fn 中的情况。 ,在使用传递给 not_fn 的一组特定参数调用时可能会也可能不会抛出自身函数调用运算符。换句话说,如果 std::__invoke(...) 则不检查本身在函数调用运算符中可能抛出或不抛出

我是否遗漏了此实现中的某些内容?

来自 cppreference.com 的实现有一点更简单的 noexcept 规范。但是,由于 known issue,此实现不适用于最新的 g++ .

最佳答案

实际上没有要求not_fn传播noexcept。它在 [func.not_fn] 中指定,四个调用操作符中的每一个看起来都像:

template<class... Args>
auto operator()(Args&&...) const&
-> decltype(!declval<invoke_result_t<const FD&, Args...>>());

没有 noexcept。也就是说,P0356建议添加它并且当前的 noexcept 说明符没有意义并且可能因错误而造成伤害,因此提交 87538 .


更新:这已在 7.4、8.3 和 9.1 中修复。

关于c++ - _Not_fn 函数调用运算符的 noexcept 说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52673235/

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