Начиная с 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[]
это просто пример, а не то, что я хочу реализовать.Это, безусловно, вариант, хотя и удивительный для многих, учитывая общую тенденцию придерживаться синтаксиса Си для операторов, знакомых программистам Си.
Это также не новая идея, Габриэль Дос Рейс предложил ее в 2014 году. Последнее задокументированное состояние идеи от Единая обработка оператора [] и оператора () это следует:
В c ++ std-core-14770 Дос Рейс предлагает, чтобы операторы [] и operator () были разрешены как статические. В дополнение к этому он предлагает, чтобы оба позволили использовать несколько параметров. Хорошо известно, что существует вероятность того, что это нарушит существующий код (допустимо foo [1,2], в скобках указано выражение с запятой), но есть возможность исправить такие случаи (требуя скобок, если выражение с запятой по желанию). EWG должна обсудить, стоит ли стремиться к такому объединению.
Обсуждается в Rapperswil 2014. EWG отмечает, что здесь нужно рассмотреть больше вопросов с точки зрения других операторов, мотиваций, связей с лямбдами без захвата, кто знает что еще, поэтому требуется аналитическая статья.
Итак, перефразирую этого выдающегося теоретика языка C ++: если вам это нравится, тогда напишите на нем статью.
Других решений пока нет …