在type_info的Visual Studio实现中,通常位于C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ typeinfo:
class type_info {
/* ... */
_CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const;
/* ... */
private:
void *_M_data;
char _M_d_name[1];
__CLR_OR_THIS_CALL type_info(const type_info& _Rhs);
/* ... */
};
我注意到等于运算符的实现==使用了字符指针_M_d_name + 1.任何人都可以向我解释这是如何工作的,因为它似乎不在数组范围内?
实现,C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ crt \ src \ ti_inst.cpp:
ASSERT_UNMANAGED_CODE_ATTRIBUTE
SECURITYSAFECRITICAL_ATTRIBUTE
bool type_info::operator==(const type_info& rhs) const
{
return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1);
}
谢谢!
答案 0 :(得分:1)
这个技巧适用于灵活的阵列成员。它将为class type_info
和名称字符串分配内存,因此(rhs._M_d_name)+1
正好是名称字符串所在的位置。这是一个描述它的图表:
+------------+ --+
| | |
+------------+
| | |
| | ->type_info
+------------+ |
+-------+ _M_d_name | |
| +------------+ --+
+-------> |
| |
| |
+------------+
实际上,c99支持此功能并a Microsoft extension allows the last member of a C or C++ structure or class to be a variable-sized array