谷歌c ++风格有以下几点.我不明白为什么前向声明会调用f(void*).
可能很难确定是否需要前向声明或完整#include.用前向声明替换#include可以默默地改变代码的含义:
// b.h:
struct B {};
struct D : B {};
// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); } // calls f(B*)
Run Code Online (Sandbox Code Playgroud)
如果#include被B和D的forward decls替换,test()将调用f(void*).