c++ - 前向声明与包含在 Google C++ 风格指南中

标签 c++ include forward-declaration

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/

相关文章:

c - 为什么结构的前向声明在我的代码中不起作用?什么时候可以在C中使用?

C++ Boost 库几何.hpp

c - <windows.h> 是否与 "raylib.h"库发生冲突

c++ - 前向声明类时成员函数的行为

javascript - 脚本的可见性包含在 IFRAME 中

javascript - 如何在每个局部 View 中仅包含一次外部 JavaScript 文件?

ios - Objective-C 字符串错误后获取意外 token

c++ - 如何使用c++中的accumulate()计算 vector 的总和直到特定索引

c++ - 在 Firebreath 中更改 Makefile

c++ - 使用 IOpenServiceManager::InstallService 设置 IE 的默认搜索引擎提供程序