gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:05 25 4
gpt4 key购买 nike

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*第一个是更好的匹配,因此选择了过载。但在转发声明的情况下 BD :

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com