【问题标题】:Forward declaration vs include in Google c++ style guide前向声明与包含在 Google c++ 样式指南中
【发布时间】:2018-05-15 15:15:24
【问题描述】:

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*)

如果#include 被替换为 B 和 D 的前向 decls,test() 将调用 f(void*)。

【问题讨论】:

  • 如果你只是做struct D;那么继承是未知的。

标签: c++ include forward-declaration


【解决方案1】:

分别考虑这两种情况。通过将#include 替换为标题的内容,我们首先有:

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

void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }

有两种可能的重载。由于D 继承自B,因此D* 可以隐式转换为B*。在B*void* 中,第一个匹配更好,因此选择了重载。但是在前向声明 BD 的情况下:

struct B;
struct D;

void f(B*) {}
void f(void*) {}
void test(D* x) { f(x); }

D 不知道从B 继承,因此不可能从D*B* 进行隐式转换。唯一匹配的重载是f(void*)

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多