Форвардное объявление и включение в руководство по стилю Google c ++ - PullRequest
0 голосов
/ 15 мая 2018

Стиль 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 заменить на forward decls для B и D, test () вызовет f (void *).

1 Ответ

0 голосов
/ 15 мая 2018

Рассмотрим два случая в отдельности.Заменив #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* в * невозможно1019 *.Единственная соответствующая перегрузка - f(void*).

...