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…
无效,因为函数不能“更改”。对于所有可能的情况,您都可以引用。