特殊的C++项目36

Joe*_*itz 2 c++ memory-management

我们正在阅读Herb Sutter的Exceptional C++书籍作为课堂作业的一部分.

我有一个问题是要理解typedef实际上在做什么并破译它是如何构造的:第36项:

如果对某人来说,通过typefef的逻辑是一个很大的帮助.

class B
{
public:
   virtual ~B();
   void operator delete (void*, size_t) throw();
   void operator delete[] (void*, size_t) throw();
   void f(void*, size_t) throw();
}
class D : public B
{
public:
   void operator delete (void*) throw();
   void operator delete[] (void*) throw();
};

typedef void (B::*PMF)(void*, size_t);
PMF p1 = &B::f;
PMF p2 = &B::operator delete;
Run Code Online (Sandbox Code Playgroud)

由于在B类(PMF)中没有指向成员函数的指针,PMF是什么以及它是如何创建的?

void typer的返回类型是无效的吗?是(void*和size_t)typedef的参数?

谢谢

Snp*_*nps 6

typedef关键字声明现有类型的别名.

例如

typedef int integral;
integral i = 1;
Run Code Online (Sandbox Code Playgroud)

该行typedef void (B::*PMF)(void*, size_t);声明了PMF一个类型的别名:指向函数的指针(即指向 void 的指针size_t)返回 void.

有关如何使用螺旋规则解释复杂声明中的类型的详细说明,请参阅此链接:顺时针/螺旋规则

PMF是该类型的别名.它可用于声明指向任何作为B成员的函数的指针,并具有相同的参数列表和返回类型.

PMF p1 = &B::f; // Declare p1 as a PMF and set it to point to address of B::f.
B b; // Create instance of B (needed as p1 points to a member function).
(b.*p1)(nullptr, 0); // Here p1 can be used as if it was a call to B::f.
Run Code Online (Sandbox Code Playgroud)