Google 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*)
如果 B 和 D 的 #include 被替换为前向声明,test() 将调用 f(void*)。
最佳答案
分别考虑这两种情况。通过替换 #include
对于标题的内容,我们首先有:
struct B {};
struct D : B {};
void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
有两种可能的重载。自 D
继承自B
然后D*
可以隐式转换为 B*
。出自B*
和void*
第一个是更好的匹配,因此选择了过载。但在转发声明B
的情况下和D
:
struct B;
struct D;
void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }
D
不知道继承自 B
所以不可能从 D*
进行隐式转换至B*
。唯一匹配的重载是 f(void*)
.
关于c++ - 前向声明与包含在 Google C++ 风格指南中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50353757/