Pet*_*ter 12 c++ include forward-declaration
Google C++样式指南指出了这一点
在极端情况下,用前向声明替换#include可以默默地改变代码的含义.
你能帮我找一些例子吗?
这是两个案例.其中一个是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,这意味着我会改变意义.