首页 > 解决方案 > 有人可以解释一下 gcc 的 _Bind::call_x() 实现中 cv 限定符的情况吗

问题描述

所以我对整个绑定实现有两个问题-

  1. 考虑来自类 _Bind 的成员函数的这段代码 -
template<typename _Result, typename... _Args, std::size_t... _Indexes>
    _Result
    __call_v(tuple<_Args...>&& __args,
         _Index_tuple<_Indexes...>) volatile
    {
      return std::__invoke(_M_f,
          _Mu<_Bound_args>()(__volget<_Indexes>(_M_bound_args), __args)...
          );
    }

如果_M_bound_args是类的成员,并且 function 是 volatile 限定的,那么不会M_bound_args,也隐式 volatile 类型,因为此方法将从 volatile_Bind对象调用,那么__volget函数的需要是什么?const volatile合格版本也一样。

  1. 在 的定义中_Mu::operatorstd::get<_Indexes>(std::move(__tuple))...使用。尽管get<>实际上可能不会移动整个元组,但在概念上这不是不正确的,移动元组,它包含传递给 bind 的所有参数以用于其他参数吗?片段
template<typename _Arg>
    class _Mu<_Arg, false, true>
    {
    public:
      template<typename _Tuple>
    _GLIBCXX20_CONSTEXPR
    _Safe_tuple_element_t<(is_placeholder<_Arg>::value - 1), _Tuple>&&
    operator()(const volatile _Arg&, _Tuple& __tuple) const volatile
    {
      return
        ::std::get<(is_placeholder<_Arg>::value - 1)>(std::move(__tuple));
    }
    };

我无法理解这一点,尽管我在 clang 的实现中看不到这样的结构。

所以,一个解释会很有帮助。

标签: c++

解决方案


推荐阅读