我不确定here这个问题是否由于措辞错误而回答了这个问题,但是:
如果我有:
struct numpair
{
some_type_with_a_size_of_2 a,b;
};
struct bignum
{
some_type_with_a_size_of_4 a;
};
我可以将一个bignums矢量重新解释为numpairs的向量吗?如果没有,是否还有其他变通方法要求我制作新的矢量并重新解释每个元素?
编辑:在我正在使用的visual studio 2017窗口上,这两种类型的大小相同。
编辑:我现在已经了解了这个严格的别名规则。这应该是二进制数据,用不同的接口查看。抛开reinterpret_cast,我可以使用这些类型的向量联合吗?
答案 0 :(得分:3)
struct A
{
int x;
};
struct B
{
int x;
};
你甚至无法重新解释这两种类型之间的强制转换。它会违反严格的别名规则。所以不,你不能做你想做的事。
§3.10左值和右值[basic.lval]
10如果程序试图访问对象的存储值 通过以下类型之一以外的glvalue 行为未定义: 54
- 对象的动态类型,
- 对象的动态类型的cv限定版本,
- 与对象的动态类型相似的类型(如4.4中所定义)
- 与对象的动态类型对应的有符号或无符号类型的类型
- 与对象的动态类型的cv限定版本对应的有符号或无符号类型的类型,
- 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(包括, 递归地,子聚合的子元素或非静态数据成员 包含联盟),
- 一种类型,它是对象动态类型的(可能是cv限定的)基类类型, - char或unsigned char类型。
54)此列表的目的是指定其中的那些情况 对象可能有也可能没有别名。
答案 1 :(得分:2)
$ cat omg.cpp && g++ omg.cpp && echo ========== && ./a.out
#include <iostream>
struct numpair {
unsigned short a,b;
};
struct bignum {
unsigned long a;
};
int main() {
std::cout << sizeof(numpair) << " != " << sizeof(bignum) << std::endl;
}
==========
4 != 8
为什么你认为类型相同?