c++ - 了解函数指针和引用

标签 c++ function c++11 function-pointers pointer-to-member

考虑以下类型:

template <class R, class... Args> using type0 = R(Args...);
template <class R, class... Args> using type1 = R(*)(Args...);
template <class R, class... Args> using type2 = R(&)(Args...);
template <class R, class C, class... Args> using type3 = R(C::*)(Args...);
template <class R, class C, class... Args> using type4 = R(C::&)(Args...);
// Any other existing syntax? R(&&)(Args...)? R(const*)(Args...)? R()(Args..)?

实际存在哪些类型? type0type1type2type3type4 之间有什么区别?中间的括号是什么意思?它们都是函数指针吗?我在哪里可以找到有关此语法的详尽文档,因为我对此非常不清楚?

最佳答案

通过别名模板 type0type3 实例化的类型都存在。但是,您不能拥有函数类型的对象,即没有通过别名模板 type0 实例化的类型的实例。

没有“对成员的引用”类型,即,我认为 type4 不起作用

这些类型相当容易理解:

  1. R(Args...) 是一个函数 value 类型(返回 R 并采用 Args... 作为参数)。本质上,这就是函数所具有的类型。 C++ 不允许这种类型的值。
  2. R(*)(Args...) 是函数指针类型。需要将 * 两边的括号(如果有名称,则使用 (*name) 中的名称)来消除 * 是否存在歧义。绑定(bind)到返回类型 R (默认)或函数类型(当有括号时)。当您想在某处传递函数时,您不使用函数值,而是使用函数指针。您可以通过函数指针调用函数。您可以将函数指针视为函数实现所在的地址,尽管不能保证这也是它的实现方式。
  3. R(&)(Args...) 是函数引用类型。函数指针和函数引用之间的关系与指针和引用之间的关系相同:如果取消引用函数指针,您将获得函数引用。
  4. R(C::*)(Args...) 是成员函数指针类型。这本质上是一个成员函数的句柄。它们更像是成员函数列表的索引,但标识了成员函数。使用对象 o 和成员函数指针 mem,您可以使用类似 (o.*mem)(args...).如果用于初始化成员指针的成员函数是虚拟的,则会发生动态分派(dispatch)(我认为没有办法在通过成员函数指针调用时阻止动态分派(dispatch))。

除了列出的函数声明之外,成员函数指针类型还可以具有 const/volatile 和/或 ref 限定,并且该函数类型还有可变参数版本。也就是说,还有

  • 指向 const 成员的指针:

    template <class R, class C, class... Args>
    using mem_const = R(C::*)(Args...) const`
    
  • 指向 volatile 成员的指针:

    template <class R, class C, class... Args>
    using mem_volatile =  R(C::*)(Args...) volatile
    
  • 指向 const volatile 成员的指针:

    template <class R, class C, class... Args>
    using mem_const_volatile =  R(C::*)(Args...) const volatile
    
  • 指向左值限定成员的指针:

    template <class R, class C, class... Args>
    using mem_lvalue =  R(C::*)(Args...) &;
    
  • 指向右值限定成员的指针:

    template <class R, class C, class... Args>
    using mem_rvalue =  R(C::*)(Args...) &&;
    
  • const/volatile 和左值/右值限定的所有组合。

  • 函数类型的变量参数列表版本(...... 也可以写为 ... ......, ...):

    template <class R, class... Args>
    using varargs = R(Args......);
    
  • 所有带有尾随变量参数列表的函数指针、引用和成员函数指针类型。

我认为这是[当前]一个相当详尽的函数和成员函数、它们的限定版本以及它们的指针/引用版本的列表。由于 C++17 还添加了异常规范,因此除了默认的 noexcept(false) 版本之外,还会有一个 noexcept(true) 版本。

关于c++ - 了解函数指针和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028752/

相关文章:

c++ - 为什么那个纯虚函数不能内联?

c++ - 错误预期声明 C++

javascript - 从另一个 .js 文件调用外部 .js 文件中的函数

c++ - 如何将范围用于传递给函数的数组

c++ - 如果条件在 C/C++ 中成立,如何自动设置一个值?

c++ - set_intersection 带有自定义设置比较器

c++ - 线性同余发生器的分析是错误的?

c++ - Qt - 如何将 QString 转换为 char(不是 char*)

oracle - PL/SQL FUNCTION 中的 INSERT 语句

c++ - 在重构深度嵌套的代码时需要帮助