C++标准(引自草案n3242)说明以下关于子对象[intro.object]:
除非对象是零字段或零大小的基类子对象,否则该对象的地址是它占用的第一个字节的地址.两个不同的对象既不是位字段也不是零大小的基类子对象应具有不同的地址.
现在,给出以下代码段:
struct empty { };
struct member: empty { };
struct derived: empty { member m; };
int main(void)
{
printf("%d", sizeof(derived));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc我相信打印出来2,而Visual C++ 2010打印出来1.我怀疑gcc正在采用标准来表示如果它们代表不同的对象,则不能对类型的存储进行别名.我打赌MSVC正在采用标准来表示如果一个子对象是零大小,你可以做任何你想做的事情.
这是不明确的行为吗?