Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解函数指针和引用_C++_Function_C++11_Function Pointers_Pointer To Member - Fatal编程技术网

C++ 理解函数指针和引用

C++ 理解函数指针和引用,c++,function,c++11,function-pointers,pointer-to-member,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, cla

考虑以下类型:

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..)?
使用type0=R(Args…)的模板;
使用type1=R(*)(参数…)的模板;
使用type2=R(&)(参数…)的模板;
使用type3=R(C::*)(Args…)的模板;
使用type4=R(C::&)(Args…)的模板;
//还有其他的语法吗?R(&&)(Args…)?R(常数*)(参数?R()(参数..)?

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

通过别名模板
type0
type3
实例化的类型都存在。但是,不能有函数类型的对象,也就是说,没有通过别名模板
type0
实例化的类型实例

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

这些类型相当容易理解:

  • R(Args…
    是一种函数值类型(返回
    R
    并将
    Args…
    作为参数)。本质上,这就是函数的类型。C++不允许这种类型的值。
  • R(*)(Args…
    是一种函数指针类型。
    *
    周围的括号(如果有名称,则使用
    (*name)
    )中的名称)来消除
    *
    是绑定到返回类型
    R
    (默认值)还是函数类型(当有括号时)的歧义。当您想将函数传递到某个地方时,您不使用函数值,而是使用函数指针。可以通过函数指针调用函数。您可以将函数指针视为函数实现所在的地址,尽管无法保证这也是函数实现的方式
  • R(&)(Args…
    是一种函数引用类型。函数指针和函数引用之间的关系与指针和引用之间的关系相同:如果取消引用函数指针,将得到函数引用
  • R(C::*)(Args…
    是成员函数指针类型。这本质上是成员函数的句柄。这些更像是成员函数列表中的索引,但标识一个成员函数。使用对象
    o
    和成员函数指针
    mem
    可以使用类似
    (o.*mem)(args…
    的方法调用成员函数。如果用于初始化成员指针的成员函数是
    virtual
    ,则会发生动态分派(我认为在通过成员函数指针调用时,没有办法阻止动态分派)
  • 除了列出的那些函数声明之外,成员函数指针类型还可以具有
    常量
    /
    volatile
    和/或ref限定,并且函数类型还有可变参数版本。就是也有

    • 指向常量的指针成员:

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

      template <class R, class C, class... Args>
      using mem_const = R(C::*)(Args...) const`
      
      template <class R, class C, class... Args>
      using mem_volatile =  R(C::*)(Args...) volatile
      
      template <class R, class C, class... Args>
      using mem_const_volatile =  R(C::*)(Args...) const volatile
      
    • 具有尾随变量参数列表的所有函数指针、引用和成员函数指针类型


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

    C没有模板。@owacoder标记更改为回答“有什么区别”:
    typo0
    是函数,
    type1
    是函数指针,
    type2
    是函数引用,
    type3
    是成员函数指针,
    type4
    是成员函数引用,除非我是错误。
    R(const*)(Args…
    无效,因为函数不能“更改”。对于所有可能的情况,您都可以引用。