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*).
单独考虑这两个案例.通过替换#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从继承B则D*是隐式转换为B*.超出B*和void*第一个是更好的匹配,以便选择过载.但在前进的情况下宣布B和D:
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*).