Почему 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()
для приема нескольких индексов.