为什么当"运算符双倍*"似乎可以完成工作时需要"运算符[]"

Why is `operator[]' needed when 'operator double*` seems to do the job

本文关键字:运算符 工作 为什么      更新时间:2023-10-16

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 []

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

我使用了内部数据double sd[],该数据在大量的代码> 5000行中进行了动态分配。然后,我需要将分配参考计数添加到此双重数组中,因为需要复制其所在的对象,然后将副本传递给用户(double sd[]为> 10000个元素,因此我不希望制作额外的副本(。这是我为此而设计的计划,而无需使用它修改代码的庞大基础,但是不确定省略operator []是否会导致任何问题。

在哪种情况下,必须拥有操作员[]?

在您希望对象充当容器而不是指针的情况下。例如,此代码:

MyContainer cnt;
if( cnt ) // something

如果您定义了operator double *,则会编译,但我不希望该代码一般为我的容器编译,因为它没有任何意义。

sd[x] = 5.0在调用 operator []之前,编译器没有上下文来应用CStandardData的隐式用户定义转换为double *。如果明确执行此类转换,则无需过载operator []static_cast<double *>(sd)[x]

也要超载operator []似乎是一个好主意,因为它可以验证通过的索引有效。