Почему «оператор []» нужен, когда «оператор двойной *», кажется, делает работу - PullRequest
3 голосов
/ 26 мая 2019

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

Я, вероятно, должен был добавить немного контекста:

Я использовал внутренние данные double sd[], которые были динамически распределены по большой базе кода> 5000 строк.Затем мне нужно было добавить подсчет ссылок на выделение для этого двойного массива из-за необходимости скопировать объект, в котором он находился, и передать копию пользователю (double sd[] составляет> 10000 элементов, поэтому я не хотел делать дополнительные копии),Это схема, которую я разработал, чтобы сделать это без необходимости изменять обширную базу кода, используя ее, но не был уверен, что пропуск operator [] может привести к любым проблемам.

Ответы [ 2 ]

8 голосов
/ 26 мая 2019

В каких ситуациях необходимо иметь оператор []?

В ситуациях, когда вы хотите, чтобы ваш объект действовал как контейнер, а не как указатель. Например этот код:

MyContainer cnt;
if( cnt ) // something

будет компилироваться, если вы определите operator double *, но я не хочу, чтобы этот код компилировался вообще для моего контейнера, потому что это не имеет никакого смысла.

0 голосов
/ 26 мая 2019

sd[x] = 5.0 не имеет контекста для компилятора для применения неявного пользовательского преобразования CStandardData в double * до вызова operator []. Если такое преобразование выполняется явным образом, перегрузка не требуется operator []: static_cast<double *>(sd)[x]

Также перегрузка operator [] в любом случае кажется хорошей идеей, поскольку она позволит вам проверить, что переданный индекс действителен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...