Почему std :: span перегружает оператор вызова функции для индексирования?

Из cppreference:

constexpr reference operator[](index_type idx) const;
constexpr reference operator()(index_type idx) const;

Возвращает ссылку на элемент idx -th последовательности. Поведение не определено, если idx находится вне допустимого диапазона (т.е. Если он меньше нуля или больше или равен size()).

Имеет смысл перегрузить operator[] для индексирования, поскольку span представляет объект, который может ссылаться на непрерывную последовательность объектов, но почему operator(), оператор вызова функции, также перегружен с той же целью? Я не верю, что в стандартной библиотеке ничего подобного не было.

Ответ 1

Это происходит потому, что mdspan, еще не принятый многомерный тип span, использует operator() для индексирования. В конце концов, operator[] принимает только один индекс, а mdspan требуется несколько индексирования.

Поэтому, чтобы позволить этим двум типам иметь как можно более похожий интерфейс, span также позволяет operator().

Обратите внимание, что использование operator() является общим соглашением в C++ для многомерного индексирования. Eigen и Boost используют его, как и многие другие.

Ответ 2

Из соответствующего предложения:

span также перегружает operator() для доступа к элементу, чтобы обеспечить совместимость с кодом, написанным для работы против представления.

view был переименован в mdspan к настоящему времени, которое еще не стандартизировано.

Как правильно mdspan ответе mdspan, mdspan будет использовать operator() для приема нескольких индексов.