是否有任何建议来统一函数类型限定符并简化可恶的函数类型?

Is there any proposal to uniformize function type qualifiers and simplify abominable function types?

本文关键字:函数 类型 任何建 是否      更新时间:2023-10-16

在处理基于函数类型匹配的模板时,可恶的函数类型组合可能是一个真正的痛苦(参见std::is_function(。

包括常量、易失性、&、&&、noexcept (加上可变参数支持(在内的杂项四元可能会导致大量的模板专用化。

但是,noexcept说明符允许使用布尔表达式noexcept(expr)

  • noexcept等效于默认noexcept(true)

那么,在未来,我们是否可以想象用这个模型来统一所有准数:

  • const资格赛将等同于const(true)
  • volatile预选赛将等同于volatile(true)
  • &预选赛将等同于&(true)
  • &&限定符将等同于&&(true)

而且,锦上添花,使限定词可以扣除,以便能够写出以下内容:

template <typename Fn>
struct function_traits;
template <typename R, bool CQ, bool VQ, bool LVRQ, bool RVRQ, bool NEQ, ARGS... Args>
struct function_traits<R(Args...) const(CQ) volatile(VQ) &(LVRQ) &&(RVRQ) noexcept(NEQ)>
{
static constexpr bool is_const_qualified = CQ;
static constexpr bool is_volatile_qualified = VQ;
static constexpr bool is_lvalue_ref_qualified = LVRQ;
...
};

我想听听对这些问题的任何想法。

我之前在std-proposals邮件列表中提出了类似的建议。在此处和此处查看线程。

这次讨论得出的结论是,在语言中添加这样一个功能将是大量的工作。不仅有必要在语言中添加规则以推断限定符的布尔参数,而且还存在许多其他问题,例如实例化和评估限定符的点。这种规模的提案还可能引入许多其他必须敲定的问题。

Gašper Ažman似乎认为,某种形式的"计算演绎"将是解决问题的替代解决方案,这将更加可行。如果您有兴趣帮助这项工作,那么我建议您与他联系。