【问题标题】:Use cases for function type typedefs with qualifiers带有限定符的函数类型 typedef 的用例
【发布时间】:2019-09-25 09:22:34
【问题描述】:

可以typedef 函数类型,即使使用类 cv- 和 ref-限定符:

typedef void F() const volatile &&;

这可以用来声明(但不能定义)非静态成员函数:

struct A {
    F f;    // void f() const volatile &&
};

F 的这种用法在模板的相关上下文中被明确禁止。

它也可以用作模板参数。据我所知,没有办法提取或操作该类型的 cv 和 ref 限定符。

这样的typedef 是否还有其他用例(使用任何限定符,不一定同时使用所有限定符)?

【问题讨论】:

标签: c++


【解决方案1】:

标准在[dcl.fct]/6 中指定了此类函数类型(具有 cv-qualifier-seqref-qualifier 的函数类型)的唯一允许用例:

带有 cv-qualifier-seqref-qualifier 的函数类型 (包括由 typedef-name ([dcl.typedef], [temp.param])) 应仅显示为:

  • (6.1) 非静态成员函数的函数类型,

  • (6.2) 成员指针所指的函数类型,

  • (6.3) 函数 typedef 声明或 alias-declaration 的顶级函数类型,

  • (6.4) type-parameter 的默认参数中的 type-id,或

  • (6.5) type-parameter ([temp.arg.type]) 的模板参数的 type-id

最小的reproducible代表性例子(mre):

using Func = void() const;
using Func2 = Func;       // (6.3)

struct C {
    Func f;               // (6.1)
};

Func C::* ptr;            // (6.2)

template <class T = Func> // (6.4)
struct S { };

S<Func> x;                // (6.5)

【讨论】:

  • 谢谢,我认为在通用代码中使用时,我错过的(相对更重要的)重要案例是 (6.2),正如 StoryTeller 在 cmets 中链接的文档所展示的那样。
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多