C编译器如何优化错误的分层向下转换以导致真正的未定义行为
请考虑以下示例:
class Base { public: int data_; }; class Derived : public Base { public: void fun() { ::std::cout << "Hi,I'm " << this << ::std::endl; } }; int main() { Base base; Derived *derived = static_cast<Derived*>(&base); // Undefined behavior! derived->fun(); return 0; } 根据C标准,函数调用显然是未定义的行为.但是在所有可用的机器和编译器(VC2005 / 2008,RH Linux和SunOS上的gcc)上,它按预期工作(打印“嗨!”).有谁知道配置此代码可以正常工作?或者可能是具有相同想法的更复杂的例子(注意,Derived不应该携带任何额外的数据)? 更新: 从标准5.2.9 / 8:
还有一个9.3.1(感谢@Agent_L):
谢谢, 解决方法
fun()函数实际上并没有做任何与this指针有关的事情,因为它不是虚函数,所以查找函数没有什么特别之处.基本上,它被称为任何普通(非成员)函数,这个指针不好.它只是不崩溃,这是完全有效的未定义行为(如果这不是一个矛盾).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 理解React组件的生命周期
- ruby – 没有从nil到integer的隐式转换 – 当尝试添加任何数
- PostgreSQL基本知识:数值类型
- c – 使用libarchive将gzip文件解压缩到内存
- react-native – 扩展Component之后的<{}>语法是什么?
- Oracle 11g Enhancements in AWR Baselines
- dojo datagrid IE9 editing status
- c# – 为什么没有IOrderedEnumerable重新实现.Contains()来
- 启动单一主线程(利用文件锁方式启动单一主线程)
- c# – 比较XmlDocument以获得相等(内容明智)