转发声明vs包含在Google c ++样式指南中

mya*_*333 2 c++ include forward-declaration

谷歌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*).

Fra*_*eux 5

单独考虑这两个案例.通过替换#include标题的内容,我们首先得到:

struct B {};
struct D : B {};

void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
Run Code Online (Sandbox Code Playgroud)

有两种可能的重载.由于D从继承BD*是隐式转换为B*.超出B*void*第一个是更好的匹配,以便选择过载.但在前进的情况下宣布BD:

struct B;
struct D;

void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
Run Code Online (Sandbox Code Playgroud)

D不知道要继承B所以不存在隐式转换可能从D*B*.唯一匹配的重载是f(void*).