为什么在似乎需要'operator double *'的情况下需要使用operator []

时间:2019-05-26 16:07:45

标签: c++ operator-overloading

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 = sdsd[x] = 5.0sd[x] >= sd[y]等,无论我是否operator []被注释掉或已定义,代码似乎可以正常工作。

在什么情况下需要operator []

我可能应该添加一些上下文:

我在超过5000行的大型代码库中使用了内部数据double sd[],该数据是动态分配的。然后,由于需要复制它所在的对象,并且需要将副本传递给用户(double sd[]大于10000个元素,因此我不需要多余的副本,因此我需要向此double数组添加分配引用计数)制作)。这是我设计的方案,无需修改使用它的大量代码,但是不确定是否operator []会导致任何问题。

2 个答案:

答案 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 []似乎都是一个好主意,因为它可以让您验证传递的索引是否有效。

相关问题