Разве при использовании нескольких синтаксисов [x, y, z, …] — оператору [] не разрешается принимать несколько параметров?

Начиная с C ++ 11 мы можем писать лямбды, такие как:

auto foo = [a, b]() { return a+b; };

с предложением захвата в квадратных скобках, в котором элементы разделяются запятыми. В C ++ 17 мы сможем использовать структурированные привязки:

for (const auto& [name, description] : planet_descriptions) {
std::cout << "Planet " << name << ":\n" << description << "\n\n";
}

что является еще одним примером разделенного запятыми предложения в квадратных скобках.

Тем не менее, мы не можем переопределить класс operator[] принять несколько параметров, например этот:

template<typename V, typename I, typename J>
const V& operator[](I i, J j) const {
return data_[width() * i + j];
}

будут не компилируется.

Я знаю, что есть обходные пути — многие упоминаются здесь:

C ++ [] оператор массива с несколькими аргументами?

Но — почему первая часть языка в то время как вторая невозможна даже как перегрузка на усмотрение программиста? Это просто потому, что никто не предложил иначе, или есть какая-то конкретная причина для этого?

Заметки:

  • Да, конечно, это создаст неоднозначность / несовместимость с использованием оператора запятой при вызове унарного operator[]: x[a, b] будет либо operator[](operator,(a,b)) или же operator[](a,b), Тем не менее, мы имеем такую ​​же неопределенность с круглыми скобками: foo(a,b) может быть вызовом двоичного файла foo() с a а также bили это может быть foo(operator,(a,b), Языковой стандарт просто устанавливает, что это первое, а не второе (или что первое предпочтительнее); такое же предпочтение может быть определено для квадратных скобок. На самом деле, если я не ошибаюсь, это на самом деле не сломает существующий код — поскольку существующий код не будет иметь двоичного кода operator[] предпочитать.
  • Пример бинарный operator[] это просто пример, а не то, что я хочу реализовать.

0

Решение

Это, безусловно, вариант, хотя и удивительный для многих, учитывая общую тенденцию придерживаться синтаксиса Си для операторов, знакомых программистам Си.

Это также не новая идея, Габриэль Дос Рейс предложил ее в 2014 году. Последнее задокументированное состояние идеи от Единая обработка оператора [] и оператора () это следует:

В c ++ std-core-14770 Дос Рейс предлагает, чтобы операторы [] и operator () были разрешены как статические. В дополнение к этому он предлагает, чтобы оба позволили использовать несколько параметров. Хорошо известно, что существует вероятность того, что это нарушит существующий код (допустимо foo [1,2], в скобках указано выражение с запятой), но есть возможность исправить такие случаи (требуя скобок, если выражение с запятой по желанию). EWG должна обсудить, стоит ли стремиться к такому объединению.

Обсуждается в Rapperswil 2014. EWG отмечает, что здесь нужно рассмотреть больше вопросов с точки зрения других операторов, мотиваций, связей с лямбдами без захвата, кто знает что еще, поэтому требуется аналитическая статья.

Итак, перефразирую этого выдающегося теоретика языка C ++: если вам это нравится, тогда напишите на нем статью.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]