operator[]
似乎是多余的,因为operator double*
似乎足够。
这是我的代码:
struct CStandardData
{
inline operator double* () { return m_standardData; }
//inline double& operator [] (size_t ix) { return m_standardData[ix]; }
size_t m_standardDataRefCnt{ 0 };
double m_standardData[1];
} sd;
我在各种不同的情况下都使用sd
,包括double *a = sd
,sd[x] = 5.0
,sd[x] >= sd[y]
等,无论我是否operator []
被注释掉或已定义,代码似乎可以正常工作。
在什么情况下需要operator []
?
我可能应该添加一些上下文:
我在超过5000行的大型代码库中使用了内部数据double sd[]
,该数据是动态分配的。然后,由于需要复制它所在的对象,并且需要将副本传递给用户(double sd[]
大于10000个元素,因此我不需要多余的副本,因此我需要向此double数组添加分配引用计数)制作)。这是我设计的方案,无需修改使用它的大量代码,但是不确定是否operator []
会导致任何问题。
答案 0 :(得分:8)
在什么情况下需要使用运算符[]?
在您希望对象充当容器而不是指针的情况下。例如此代码:
MyContainer cnt;
if( cnt ) // something
如果定义operator double *
将会编译,但是我不希望这段代码为我的容器一般编译,因为它没有任何意义。
答案 1 :(得分:-1)
sd[x] = 5.0
没有上下文供编译器在调用CStandardData
之前应用double *
到operator []
的隐式用户定义转换。如果显式执行了这种转换,则无需重载operator []
:static_cast<double *>(sd)[x]
无论如何,重载operator []
似乎都是一个好主意,因为它可以让您验证传递的索引是否有效。