考虑以下类型:
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
、type1
、type2
、type3
、type4
之间有什么区别?中间的括号是什么意思?它们都是函数指针吗?我在哪里可以找到有关此语法的详尽文档,因为我对此非常不清楚?
最佳答案
通过别名模板 type0
到 type3
实例化的类型都存在。但是,您不能拥有函数类型的对象,即没有通过别名模板 type0
实例化的类型的实例。
没有“对成员的引用”类型,即,我认为 type4
不起作用
这些类型相当容易理解:
R(Args...)
是一个函数 value 类型(返回R
并采用Args...
作为参数)。本质上,这就是函数所具有的类型。 C++ 不允许这种类型的值。R(*)(Args...)
是函数指针类型。需要将*
两边的括号(如果有名称,则使用(*name)
中的名称)来消除*
是否存在歧义。绑定(bind)到返回类型 R (默认)或函数类型(当有括号时)。当您想在某处传递函数时,您不使用函数值,而是使用函数指针。您可以通过函数指针调用函数。您可以将函数指针视为函数实现所在的地址,尽管不能保证这也是它的实现方式。R(&)(Args...)
是函数引用类型。函数指针和函数引用之间的关系与指针和引用之间的关系相同:如果取消引用函数指针,您将获得函数引用。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/