好的,所以我知道从技术上讲这是未定义的行为,但尽管如此,我在生产代码中不止一次看到过这种情况。如果我错了,请纠正我,但我也听说有些人使用这个“功能”作为当前 C++ 标准缺乏方面的某种合法替代品,即无法获取地址(嗯,成员函数的偏移量。例如,这是 PCRE(Perl 兼容的正则表达式)库的流行实现:
#ifndef offsetof
#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
#endif
人们可以争论在这样的情况下利用这种语言的微妙之处是否有效,甚至是必要的,但我也看到它是这样使用的:
struct Result
{
void stat()
{
if(this)
// do something...
else
// do something else...
}
};
// ...somewhere else in the code...
((Result*)0)->stat();
这工作得很好!它通过测试 的存在来避免空指针取消引用this
,并且它不会尝试访问else
块中的类成员。只要这些防护措施到位,它就是合法的代码,对吧?所以问题仍然存在:是否有一个实际的用例,可以从使用这种结构中受益?我特别关心第二种情况,因为第一种情况更多的是一种解决语言限制的方法。或者是吗?
PS。对 C 风格的演员表感到抱歉,不幸的是,如果可以的话,人们仍然喜欢少打字。