通过用include替换前向声明来更改代码的含义

Pet*_*ter 12 c++ include forward-declaration

Google C++样式指南指出了这一点

在极端情况下,用前向声明替换#include可以默默地改变代码的含义.

你能帮我找一些例子吗?

Yak*_*ont 7

这是两个案例.其中一个是UB,另一个我认为是行为的定义变化(假设没有ODR或类似的违规行为:即,没有foo看到定义的调用A,但我不确定)

namespace N {
  struct B {};
  struct A;//:B{};
}

void foo(N::B*){
  std::cout << "B\n";
}
template<class T, class=std::enable_if_t<!std::is_convertible<T*,N::B*>{}>>
void foo(T*){
  std::cout << "T\n";
}

int main() {
  foo( (N::A*)0 );
}
Run Code Online (Sandbox Code Playgroud)

更换struct A;struct A:B{};将改变其的foo过载被调用.

此外,如果delete A;调用~A()它时delete A;可以调用它.否则,如果有一个非平凡的析构函数,我们有UB.在这种情况下,代码的含义会发生变化,因为它从UB变为DB,这意味着我会改变意义.