考虑一下:
class Vec3
{
private:
float n[3];
public:
float& x;
float& y;
float& z;
Vec3(float x_, float y_, float z_) : x(n[0]), y(n[1]), z(n[2])
{
x = x_;
y = y_;
z = z_;
}
}
我能确定这样做:
Vec3 v(1,2,3);
cout<<reinterpret_cast<float*>(&v)[0]<<"\t";
cout<<reinterpret_cast<float*>(&v)[1]<<"\t";
cout<<reinterpret_cast<float*>(&v)[2]<<"\t";
每个遵循标准的编译器/操作系统会给我1 2 3
吗?
答案 0 :(得分:5)
没有。为此,您需要(至少)标准布局类型。 float&
不是,因此Vec3
也不是。 (9/7,第一个子弹)。
答案 1 :(得分:3)
正如其他答案所述,由于float&
,这不起作用。有关标准布局的详细说明,请参阅Standard Layout Classes and Trivially Copyable Types。
您可以考虑采用略有不同的方法:
class Vec3
{
private:
float n[3];
public:
float& x() { return n[0]; }
float& y() { return n[1]; }
float& z() { return n[2]; }
Vec3(float x_, float y_, float z_)
{
x() = x_;
y() = y_;
z() = z_;
}
};
因此,
Vec3 v(1,2,3);
cout<<reinterpret_cast<float*>(&v)[0]<<"\t";
cout<<reinterpret_cast<float*>(&v)[1]<<"\t";
cout<<reinterpret_cast<float*>(&v)[2]<<"\t";
将为所有编译器打印1 2 3
修改强>
您可能还希望看到What are Aggregates and PODs (1st answer)和What are Aggregates and PODs (2nd answer)以获取更准确的信息。
答案 2 :(得分:1)
不。你的班级不是POD,所以没有任何保证,AFAIK。