c ++ 11 — фундаментальные причины, по которым нельзя использовать оператор с несколькими аргументами [] в переполнении стека

В настоящее время мы можем только перегружать operator[] с ровно одним аргументом.

Я хотел бы знать, если есть фундаментальная причина, почему стандарт не позволяет перегружать operator[] за несколько аргументов?

Существуют ли таким образом пропопозалы для C ++ 17?

3

Решение

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

В основном, что несколько аргументов для 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 или эквивалент.

5

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

Я хотел бы знать, если есть фундаментальная причина, почему стандарт не позволяет перегружать operator[] за несколько аргументов?

Нет фундаментальной причины; только общий принцип, что перегруженные операторы имеют тот же синтаксис, что и встроенный оператор, который они перегружают.

Существуют ли таким образом пропопозалы для C ++ 17?

Нет. Распространенной альтернативой является перегрузка operator(); это может принять столько аргументов, сколько вы захотите.

5

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