c++ - 有人可以解释一下 gcc 的 _Bind::call_x() 实现中 cv 限定符的情况吗
问题描述
所以我对整个绑定实现有两个问题-
- 考虑来自类 _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
合格版本也一样。
- 在 的定义中
_Mu::operator
,std::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 的实现中看不到这样的结构。
所以,一个解释会很有帮助。
解决方案
推荐阅读
- ffmpeg - 使用 frameskip 从视频 FFMPEG 中提取帧并相应地命名。\
- ruby-on-rails - 如何对关联错误消息进行分组?
- php - 按值对 Laravel 集合进行排序
- javascript - 为什么我的 fetch 在第一次调用时返回错误,但在后续调用中却没有?
- python - 使用基准年计算指数
- javascript - 我应该使用什么下拉菜单里面有很多元素?
- typescript - 如何在 Webpack 上避免重复的 sass 导入(使用 @use)
- c++ - 如何将 c 样式的字符串或字符串文字附加到 std::vector
? - python-3.6 - 如何将 TensorFlow 对象检测 API 模型转换为 TFLite?
- java - java中的正偶数代码帮助(Uncaught SyntaxError: Unexpected identifier",)