В настоящее время мы можем только перегружать operator[]
с ровно одним аргументом.
Я хотел бы знать, если есть фундаментальная причина, почему стандарт не позволяет перегружать operator[]
за несколько аргументов?
Существуют ли таким образом пропопозалы для C ++ 17?
Это наверное мог быть добавленным, но не должен, потому что это ломает существующий код.
В основном, что несколько аргументов для operator[]
будет означать, что следующее будет компилироваться:
struct Foo
{
int operator[](int a, int b, int c)
{
return 0;
}
}
int main()
{
Foo foo;
auto n = foo[1, 2, 3]; // list of parameters
}
Однако учтите это:
int main()
{
Foo foo;
std::vector<int> bar(4, 0);
auto n = foo[1, 2, 3]; // list of parameters
auto x = bar[1, 2, 3]; // comma operator! returning the 3rd element of bar. valid syntax
}
Это будет означать, что в выражении, использующем запятую внутри квадратных скобок, может быть либо список параметров, либо использование оператора запятой.
Следовательно, для аргументов оператора [] может быть только одно действительное число, то есть это не может быть разрешено:
struct Foo
{
int operator[](int a, int b, int c)
{
return 0;
}
int operator[](int a)
{
return 1;
}
}
Там нет никакого способа, чтобы устранить неопределенность 1, 2, 3
Вот. Это означает: если стандарт изменится, чтобы разрешить это, любой код, использующий оператор запятой в вызовах operator[]
станет ошибкой компиляции. Стандартный комитет изо всех сил старается не нарушать существующий код (что хорошо!) С введением новых функций. На мой взгляд, это было бы довольно радикальным изменением и поэтому вряд ли будет сделано.
Если вам нужно несколько аргументов, используйте другой оператор (как предложил Майк, operator()
будет работать) или передать std::tuple
или эквивалент.
Я хотел бы знать, если есть фундаментальная причина, почему стандарт не позволяет перегружать
operator[]
за несколько аргументов?
Нет фундаментальной причины; только общий принцип, что перегруженные операторы имеют тот же синтаксис, что и встроенный оператор, который они перегружают.
Существуют ли таким образом пропопозалы для C ++ 17?
Нет. Распространенной альтернативой является перегрузка operator()
; это может принять столько аргументов, сколько вы захотите.