我在查看OpenDE的源代码时发现了一些奇怪的用法,使用类的数组索引运算符'[]'。以下是一个简化的例子展示此语法:
#include <iostream>
class Point
{
public:
Point() : x(2.8), y(4.2), z(9.5) {}
operator const float *() const
{
return &x;
}
private:
float x, y, z;
};
int main()
{
Point p;
std::cout << "x: " << p[0] << '\n'
<< "y: " << p[1] << '\n'
<< "z: " << p[2];
}
输出:
x: 2.8
y: 4.2
z: 9.5
这里发生了什么?为什么这个语法可以工作?Point类没有重载operator []
,但是这里的代码正在尝试进行某种自动转换到float。
我以前从未见过这种用法--至少看起来很不寻常和令人惊讶。
谢谢
operator[]
还是指针转换函数,可以通过以下奇怪的测试:如果0[p]
能够正常工作,则表示使用了指针转换。如果0[p]
无法正常工作,但p[0]
可以正常工作,则表示使用了operator[]
。 - Johannes Schaub - litb