通过将前向声明替换为包含来更改代码的含义
Change the meaning of code by replacement of forward declaration with include
Google C++ Style Guide 指出
在极端情况下,将 #include 替换为前向声明可以静默地更改代码的含义。
你能帮我找到一些例子吗?
这里有两种情况。 其中一个是UB,另一个我认为是行为的定义变化(假设没有ODR或类似的违规行为:即,没有调用foo
看到A
的定义,但我不确定)
namespace N {
struct B {};
struct A;//:B{};
}
void foo(N::B*){
std::cout << "Bn";
}
template<class T, class=std::enable_if_t<!std::is_convertible<T*,N::B*>{}>>
void foo(T*){
std::cout << "Tn";
}
int main() {
foo( (N::A*)0 );
}
将struct A;
替换为struct A:B{};
将更改调用哪个foo
重载。
此外,如果调用~A()
时delete A;
可见,delete A;
将调用。 否则,如果有一个非平凡的析构函数,我们有 UB。 在这种情况下,代码的含义发生了变化,因为它从UB转到DB,我想这是含义的变化。
我知道的最阴险的例子之一是 C 风格转换与继承相结合。
假设您有:
class Parent1 {};
class Parent2 {};
class Child : public Parent1, public Parent2 {};
然后在其他一些文件中,您从 Parent2 转换为子级:
Parent2* parent2_ptr = new Child;
Child* obj = (Child*)parent2_ptr;
在完整定义下,C型强制转换是一个static_cast
,正确地固定了地址。通过前向声明(Child),C风格的演员变成了无声地破坏代码的reinterpret_cast
。
相关文章:
- 编译包含字符串的代码时遇到问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 如何将外部代码包含在虚幻引擎4 C++项目中
- 如果代码包含多个复杂度循环,如何计算复杂度
- 如何使用 cmake 在代码中包含、构建和调试共享库 (.so)?
- 在 C++ 对象包装器中安全地包含 C 代码
- 为什么我的代码包含错误分段错误(核心转储)?
- 如何在此代码中包含 While 语句
- 在源文件中包含额外的调试信息,以便在代码::块中使用gdb进行调试
- 在Visual Studio代码中包含自定义c++库的问题
- 当我在结构中包含多个数组时,我的程序会跳过一堆代码
- C++:汇编代码包含断言结果
- 如何为代码包含负值?号码系统转换
- C++模板可以用于条件代码包含吗
- 如何将文件作为字符串和代码包含在cpp中
- C++代码包含错误
- c++宏:条件代码包含在表达式NOT语句中
- 端口C代码包含复数到c++
- 将模板代码包含在多个编译单元中,它将始终链接而不内联