【发布时间】:2019-11-18 17:29:20
【问题描述】:
例如:
int x = 5;
std::cout<<(&x)[0]<<std::endl; -> prints 5
我在一本书中找到了 3DVector 的这种表示:
struct Vector3D{
float x,y,z;
Vector3D() = default;
Vector3D(float a, float b, float c) : x(a), y(b), z(c) {}
float & operator[](int i){
return ((&x)[i]);
}
};
如果将其用作:
Vector3D myVec(0,2,3);
std::cout<<myVec[0]<<std::endl;
std::cout<<myVec[1]<<std::endl;
std::cout<<myVec[2]<<std::endl;
它将打印 x、y、z 的值
它是如何工作的?这安全吗?
【问题讨论】:
-
为什么我必须确定声明的变量是一一存在的?或者这只适用于这种特殊情况?
-
要获得安全的东西,必须使用offsetof。另请注意“offsetof 无法在标准 C++ 中实现,需要编译器支持”,因为它取决于结构的成员填充
-
@ChrisMM “它们以这种方式存储在内存中”可能但不一定。它不是“通常被认为是不安全的”。这只是未定义的行为,根据定义,它总是不安全,永远不会有用或有帮助。
-
@ChrisMM 我不太明白。 “你会看到问题......”相当具有误导性。有可能看不到任何问题
标签: c++ overloading operator-keyword