代码之家  ›  专栏  ›  技术社区  ›  Edgar Rokjān

函数调用运算符的noexcept说明符

  •  1
  • Edgar Rokjān  · 技术社区  · 6 年前

    在这个问题上,我考虑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>()));
    

    1. _S_not<__inv_res_t<_Fn _QUALS, _Args...>> .
    2. _不<__库存资源<_Fn\u QUALS,\u Args…>&燃气轮机; std::__invoke(...)

    从我的观点来看,这个noexcept规范不包括可调用对象包装到 not_fn ,在使用传递给的一组特定参数调用时,可以抛出自身,也可以不抛出自身 不是 函数调用运算符。换句话说, 如果 标准::\u调用(…) 函数调用操作符内部的自身可能抛出或不抛出

    我在这个实现中遗漏了什么吗?

    实施从 cppreference.com known issue .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Barry    6 年前

    实际上没有要求 not_fn 传播 noexcept . 在中指定 [func.not_fn] ,四个呼叫接线员中的每一个看起来都像:

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

    无例外 . 也就是说, P0356 建议添加它和当前 无例外 说明符没有意义,可能会因为错误而造成伤害,所以归档 87538 .