c ++ operator [] прекрасно компилируется с несколькими аргументами, есть ли способ избежать этого? - PullRequest
0 голосов
/ 23 апреля 2020

если у меня есть

int arr[10] = { 1,2,3,4,5 };
std::cout << arr[1,4] << "\n";

, код компилируется нормально и возвращает 5 (обр. [4]). Это верно даже при перегрузках оператора [] в разных классах. Другими словами, если у меня есть:

class A{
public:
  int operator[](int i) {return i;}
}

A a;
std::cout<<a[1,4];

, я получу 4 (a [4]). Нет проблем компиляции. Есть ли способ избежать потенциальных ошибок из-за ошибки компиляции в таких случаях?

1 Ответ

1 голос
/ 23 апреля 2020

Здесь вы видите оператор запятой в действии. Левый оператор оценивается, его результат отбрасывается, а результатом выражения является правый оператор.

Есть ли способ избежать потенциальных ошибок из-за ошибки компиляции в таких случаях?

Хорошо .. вы можете выбрать пользовательский тип для индекса и перегружать его запятой оператор. Однако не рекомендуется .

Вместо этого обратите внимание на предупреждения вашего компилятора. Например, g cc -Wall предупреждает об этом коде:

int main(){
    int x = (1,2);
}

с

<source>:4:14: warning: left operand of comma operator has no effect [-Wunused-value]

4 |     int x = (1,2);

  |              ^
...